软件设计模式复习题(4)
而剩下的不能共享的属性,则可以由客户端维护,并在需要的时候传入享元,传入的不能共享的属性不能影响内部的不可变属性。 12、 使用解析器模式实现对学生成绩表的查询输入语句进行解析并执行查询,成绩表
Stack存储解析后信息类: namespace Interpreter{ public class Stack{ ArrayList stk; public Stack(){ stk = new ArrayList ();} public void push(Object obj) { stk.Add (obj); } public ParseObject pop() { int i = stk.Count -1; ParseObject obj = (ParseObject) stk[i]; stk.RemoveAt (i); return obj;} public ParseObject top() { int i = stk.Count -1; return (ParseObject)stk[i];} public bool hasMoreElements() { return stk.Count > 0;} public ParseObject nextTop() {
int i = stk.Count -2; if (i >= 0) return (ParseObject)stk[i]; else return null;} public void pop2Push(ParseObject p){ int i = stk.Count ; if (i >= 2) { pop(); pop(); push(p);} else push(p);}}} ParseObject解析对象类: public class ParseObject{ public const int VERB=1000; public const int VAR=1010; public const int MULTVAR=1020; protected int value, type; public ParseObject(int val, int typ) { value = val; type = typ; } public int getValue() { return value;} public int getType() { return type;}} Parser解析类: public class Parser{
public Parser(string line, StudentData kd, ListBox pt) { stk = new Stack (); actionList = new ArrayList (); setData(kd, pt); buildStack(line); buildChain();}
public void setData(StudentData kd, ListBox pt) { dat = new Data(kd.getData ()); ptable = pt;} public void Execute() { while(stk.hasMoreElements () ) { chn.sendToChain (stk);} for(int i=0; i< actionList.Count ; i++ ) { Verb v = (Verb)actionList[i]; v.setData (dat, ptable); v.Execute ();}}}
Form1窗口:
namespace Interpreter{ public class InterpForm : System.Windows.Forms.Form{ private System.Windows.Forms.TextBox txCommand; private System.Windows.Forms.Button btCompute; private System.Windows.Forms.ListBox lsResults; private StudentData kdata; public InterpForm(){ InitializeComponent(); init();} private void init() { kdata = new StudentData ("data.txt");}
[STAThread] static void Main() { Application.Run(new InterpForm());}
private void btCompute_Click(object sender, System.EventArgs e) {
Parser par = new Parser (txCommand.Text ,kdata, lsResults); par.Execute ();}}} 13、 结合命令模式和备忘录模式实现程序的undo和redo功能。 答:Form1:
public Form1() { InitializeComponent(); init();}
private void init() {
btBlue.setCommand (blueC=new BlueCommand (pBox)); btRed.setCommand (redC=new RedCommand (pBox)); btUndo.setCommand (undoC = new UndoComd ()); btRedo.setCommand(redoC = new RedoComd()); EventHandler evh = new EventHandler (commandClick); btBlue.Click += evh; btRed.Click += evh; btUndo.Click += evh; btRedo.Click += evh; pBox.Paint += new PaintEventHandler (paintHandler); redoundo();}
public void redoundo(){
RedoComd.redolist = new ArrayList(); if (RedoComd.redolist.Count < 1){ btRedo.Enabled = false;}
UndoComd.undolist = new ArrayList(); if (UndoComd.undolist.Count < 1){ btUndo.Enabled = false;}} private void commandClick(object sender, EventArgs e) { Command comd = ((CommandHolder)sender).getCommand ();
undoC.add (comd); comd.Execute (); redoC.add(comd); comd.Execute();}
public void paintHandler(object sender, PaintEventArgs e) {
Graphics g = e.Graphics ; blueC.draw(g); redC.draw (g); }
[STAThread]
static void Main(){
Application.Run(new Form1());} Command:
public interface Command { void Execute(); void Undo(); void Redo(); bool isUndo(); bool isRedo();}
public class UndoComd:Command { public static ArrayList undolist; public UndoComd(){
undolist = new ArrayList();} public void add(Command comd) { if(! comd.isUndo ()) {
undolist.Add(comd);}} public bool isUndo() { return true;} public void Undo() { } public void Execute() { int unIndex =undolist.Count - 1; if (unIndex >= 0){
Command cmd = (Command)undolist[unIndex]; cmd.Undo();
RedoComd.redolist = new ArrayList(); RedoComd.redolist.Add(cmd); undolist.Remove(unIndex);}}} public class RedoComd:Command { public static ArrayList redolist; public RedoComd(){
redolist = new ArrayList();} public void add(Command comd) { if(! comd.isRedo ()) {
redolist.Add(comd);}} public bool isRedo() {
return true; } public void Redo() { } public void Execute() { int reIndex =redolist.Count - 1; if (reIndex >= 0){
Command cmd = (Command)redolist[reIndex]; cmd.Redo();
UndoComd.redolist = new ArrayList(); UndoComd.redolist.Add(cmd); redolist.Remove(reIndex);}}} 14、 试比较和分析中介者模式和观察者模式之间的相似性和差异性?两者是否能够相
互转化?
答:中介者模式和观察者模式的区别是,前者应用于多对多杂乱交互行为的统筹处理,后者应用于一(多)对多关系的灵活定制。对于本例来说,集中处理后还需要分散处理,那么后半阶段的处理过程可以应用观察者模式。对于前一节的例子来说,如果有多个主体角色和多个观察者进行多对多通讯的话,也可以应用中介者模式来统筹这个多对多的过程(大家可以自己尝试修改前一节的实例来应用中介者模式)。 15、 使用访问者模式对12题中的学生信息进行报到。 答:public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable. /// </summary>
private ponentModel.Container components = null; private Student[] empls; private Student empl ;
private System.Windows.Forms.Button btCompute; private System.Windows.Forms.ListBox lsVac; …… 此处隐藏:4437字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [小学教育]四年级综合实践活动课《衣物的洗涤》教
- [小学教育]2014半年工作总结怎么写
- [小学教育]20世纪外国文学专题综合试题及答案
- [小学教育]TS_1循环使用催化丙烯环氧化反应研究
- [小学教育]最实用的考勤签到表(上下班签到表)
- [小学教育]气候与生态建筑——以新疆民居为例
- [小学教育]二人以上股东有限责任公司章程参考样本
- [小学教育]2014届第一轮复习资料4.1,3美好生活的
- [小学教育]土方开挖、降水方案
- [小学教育]手绘儿童绘本《秋天的图画》(蜡笔)
- [小学教育]2002级硕士研究生卫生统计学考试试题
- [小学教育]环保装备重点发展目录
- [小学教育]金蝶K3合并报表培训教材
- [小学教育]岩浆岩试题及参考答案
- [小学教育]知之深爱之切学习心得
- [小学教育]第十二章 蛋白质的生物合成
- [小学教育]Chapter 2-3 Solid structure and basi
- [小学教育]市政道路雨季专项施工方案
- [小学教育]中国海洋大学2012-2013学年第二学期天
- [小学教育]教育心理学第3章-学习迁移
- 浅谈深化国企改革中加强党管企业
- 2006年中国病理生理学会学术活动安排
- 设计投标工作大纲
- 基于ARP的网络攻击与防御
- 2016届湖北省七市(州)教科研协作体高三
- Google_学术搜索及其检索技巧
- 2019-2020学年七年级地理下册6.3美洲教
- 城市道路可研报告
- 【名师指津】2012高考英语 写作基础技
- 6级知识点培训北京师范大学《幼儿智趣
- 注册会计师会计知识点:金融资产
- 新安装 500 kV 变压器介损分析与判断
- PS2模拟器PCSX2设置及使用教程.
- 医院药事管理与药剂科管理组织机构
- {PPT背景素材}丹巴的醉人美景,免费,一
- NAS网络存储应用解决方案
- 青海省西宁市六年级上学期数学期末考试
- 测量管理体系手册依据ISO10012:2003
- 洞子小学培养骨干教师工作计划
- 浅谈《牛津初中英语》的教材特点及教学




