设计模式随笔-锦囊妙计
来源:互联网 发布:windows10清理垃圾软件 编辑:程序博客网 时间:2024/04/29 19:56
话说《三国演义》中,周瑜与孙权定下计谋,以孙权之妹为诱饵,骗刘备过江到东吴招亲,想趁机杀害刘备,索回荆州。诸葛亮早识破了诡计,令武将赵云随同并护卫刘备前往,并给赵云了三个锦囊,嘱咐他依次执行即可。结果,赵云按照诸葛亮的锦囊妙计行事,不仅帮助刘备将孙权之妹孙尚香夫人迎娶回来,还得到孙权之母吴国太的欢心,陪同刘备夫妇回了荆州。《三国演义》这段记叙,为后世创造了“锦囊妙计”和“赔了夫人又折兵”两个成语。
今天,我就“锦囊妙计”来说说Command模式。从面向对象的设计角度来说,锦囊妙计有以下几个特色:
1、妙计被装入锦囊后都变得一般模样,没有任何区别。
2、锦囊妙计自己是无法实施的,必须由某个人依计行事。
3、实施者有权利选择执行命令或不执行命令,也可以选择在什么时候执行。当然,在我们的故事中,赵云在合适的时间执行了合适的妙计,便为我们留下了精彩的故事。
这个故事用代码书写出来如下:
using System.Collections;
abstract class JinNang
{
public string message = "";
public void Execute()
{
Console.WriteLine(message);
}
}
class JinNang1 : JinNang
{
public JinNang1()
{
this.message = "ToDo:让刘备拜见岳艾乔国老,并大造声势。";
}
}
class JinNang2 : JinNang
{
public JinNang2()
{
this.message = "ToDo:假报刘备:曹操起兵五十万,杀奔荆州。";
}
}
class JinNang3: JinNang
{
public JinNang3()
{
this.message = "ToDo:向孙夫人揭穿了孙权和周瑜的阴谋,请求夫人保护。";
}
}
abstract class Receiver
{
protected Queue commands = new Queue();
public void SetCommand(JinNang c)
{
commands.Enqueue(c);
}
protected JinNang GetCommand()
{
if (this.commands.Count != 0)
{
JinNang c = (JinNang)this.commands.Dequeue();
return c;
}
else
return null;
}
public bool FulfilCommand(JinNang c)
{
if(c != null)
{
c.Execute();
return true;
}
else
{
Console.WriteLine("惨了!无计可施了!");
return false;
}
}
abstract public void DoComplexJob();
}
class Zhaoyun : Receiver
{
public override void DoComplexJob()
{
Console.WriteLine("护送刘备去东吴");
Console.WriteLine("到达市徐");
if(!FulfilCommand(GetCommand())) return;
Console.WriteLine("刘备娶了孙权之妹");
Console.WriteLine("发现刘备全不想回荆州");
if(!FulfilCommand(GetCommand())) return;
Console.WriteLine("被孙权追杀");
if(!FulfilCommand(GetCommand())) return;
Console.WriteLine("安然护送刘备抵达荆州,任务完成!");
}
}
class ZhuGeLiang
{
public void JinNangMiaoJi(Receiver r)
{
r.SetCommand(new JinNang1());
r.SetCommand(new JinNang2());
r.SetCommand(new JinNang3());
}
}
public class Client
{
public static void Main( string[] args )
{
Receiver r = new Zhaoyun();
ZhuGeLiang z = new ZhuGeLiang();
z.JinNangMiaoJi(r);
r.DoComplexJob();
}
}
“命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象”。通过将妙计封装成锦囊妙计,便成为可委派的妙计。由一个对象(ZhuGeLiang)创建并封装,然后传递给另一个对象(ZhaoYun),命令在此没有被立即执行,而是Enqueue了。当条件合适的时候,再将命令解开执行。另外,所有的锦囊妙计都有一个共同的特性,就是可以被执行。所以,赵云不用关心这个锦囊与那个锦囊有什么区别,只需执行便是了。
该例子仅仅取了一个Command模式的“意”,丢弃了Command模式的形。设计模式的应用无需过于死板。如果对Command模式感兴趣,可以访问《设计模式(18)-Command Pattern》
- 设计模式随笔-锦囊妙计
- 设计模式随笔-发大米喽
- 设计模式随笔-用奶箱订报纸
- 设计模式随笔分类
- 设计模式随笔系列
- 设计模式随笔
- 设计模式随笔
- 设计模式------随笔
- 设计模式随笔一
- 设计模式初见随笔
- 设计模式&注解随笔
- 设计模式随笔-策略模式
- 设计模式随笔-观察者模式
- 设计模式随笔-工厂模式
- 设计模式随笔-策略模式
- 设计模式随笔-命令模式
- 设计模式随笔-观察者模式
- 设计模式随笔-适配器模式
- DIV文字自动换行的实现
- 列转行的一视图
- 设计模式随笔-从“有病”说起(工厂模式前传)
- 好比你有一个衣橱,里面塞满了各种衬衫,你会怎么整理这些衬衫,好让你以后找衬衫的时候容易些? - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- 如果在高速公路上30分钟内到一辆车开过的几率是0.95,那么在10分钟内看到一辆车开过的几率是多少 (假设为常概率条件下) - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- 设计模式随笔-锦囊妙计
- 黑屏解密
- 谁能定义richtextbox 的格式
- 谷歌浏览器的源码分析(27)
- 设计模式随笔-发大米喽
- 设计模式随笔-用奶箱订报纸
- 如果你看到钟的时间是3:15,那一刻时针和分针的夹角是多少?(肯定不是0度!) - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- 设计模式随笔-让众口不再难调
- 4个人晚上要穿过一座索桥回到他们的营地。可惜他们手上只有一支只能再坚持17分钟的手电筒。通过索桥必须要拿着手电,而且索桥每次只能撑得起两个人的份量。这四个人过索桥的速度都不一样,第一个走过索桥需要1分钟,第二个2分钟,第三个5分钟,最慢的那个要10分钟。