为什么80%的码农都做不了架构师?>>>   

话说《三国演义》中,周瑜与孙权定下计谋,以孙权之妹为诱饵,骗刘备过江到东吴招亲,想 趁机杀害刘备,索回荆州。诸葛亮早识破了诡计,令武将赵云随同并护卫刘备前往,并给赵云了三个锦囊,嘱咐他依次执行即可。结果,赵云按照诸葛亮的锦囊妙计 行事,不仅帮助刘备将孙权之妹孙尚香夫人迎娶回来,还得到孙权之母吴国太的欢心,陪同刘备夫妇回了荆州。《三国演义》这段记叙,为后世创造了“锦囊妙计” 和“赔了夫人又折兵”两个成语。

今天,我就“锦囊妙计”来说说Command模式。从面向对象的设计角度来说,锦囊妙计有以下几个特色:

1、妙计被装入锦囊后都变得一般模样,没有任何区别。

2、锦囊妙计自己是无法实施的,必须由某个人依计行事。

3、实施者有权利选择执行命令或不执行命令,也可以选择在什么时候执行。当然,在我们的故事中,赵云在合适的时间执行了合适的妙计,便为我们留下了精彩的故事。

这个故事用代码书写出来如下:

using  System;
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》

转载于:https://my.oschina.net/qihh/blog/57820

设计模式随笔-锦囊妙计相关推荐

  1. 设计模式随笔系列:鸭子-策略模式(Strategy)[原]

    原文地址为: 设计模式随笔系列:鸭子-策略模式(Strategy)[原] 鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所 ...

  2. 设计模式随笔系列:鸭子-策略模式(Strategy)

    鸭子-策略模式(Strategy) 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜 ...

  3. 无招胜有招——面向对象设计模式随笔,

    最近在学习面向对象设计模式,GOF的23种设计模式大概看了一遍,简单总结一下,设计模式主要分为三种模式,分别是创建模式,结构模式,行为模式. 回过头想一下具体有哪些模式,在什么情况下用什么设计模式,好 ...

  4. 设计模式随笔-用奶箱订报纸

    为什么80%的码农都做不了架构师?>>> 几天前给学生上课,一个学生问我用Delegate与Event实现Observer模式与不用它们实现到底有什么区别?我便讲了一个用奶箱订报纸的 ...

  5. 大话设计模式(十四 设计模式不能戏说!设计模式怎就不能戏说?)

    (续上篇) 次日,小菜来到大鸟处.        "大鸟,你在写什么东西?"小菜看到大鸟的电脑上开着记事本.        "哦,我打算写篇博客,名字就叫<设计模式 ...

  6. [活动]《博客园精华集》设计模式分册第2轮筛选结果公示

    说明 <博客园精华集>设计模式分册第2论筛选结果,总共有284篇,主要由TerryLee.idior.怪怪三人完成.在经过第三轮打分之后,还会有很多的文章出局.请大家发现以下文章中有转载或 ...

  7. 《设计模式》(精华集)

    Web Client Software Factory系列(3):View-Presenter模式作者: TerryLee .NET设计模式(18):迭代器模式(Iterator Pattern)作者 ...

  8. 设计模式(博客园精化集)〈转〉

    转自:http://blog.csdn.net/tuwen/archive/2011/03/04/6224179.aspx Web Client Software Factory系列(3):View- ...

  9. 《设计模式》(博客园精华集)

    转自:http://archive.cnblogs.com/a/1720782/  在此非常感谢谢博主 圣殿骑士 Web Client Software Factory系列(3):View-Prese ...

最新文章

  1. Oracle全文检索示例
  2. boost::dynamic_bitset模块的测试程序
  3. php优先级,PHP运算优先级——神一般的设定
  4. 猎户星空否认停发高管薪资:无论遭遇怎样困难 都不会苛扣员工薪酬
  5. 力扣题目系列:605. 种花问题
  6. latex减少图片和图片解释文字之间的距离
  7. windows 2003 iis php,windows 2003 iis安装php 5.2版本步骤
  8. 欺骗的艺术.资料搜集自互联网.
  9. 微信浏览器禁止下载的处理方法-跳转浏览器打开
  10. LM2903器件使用说明
  11. 计算机冗余,计算机中的冗余是什么意思
  12. 无线路由器连接电信光猫实现拨号上网方法
  13. win10下yolov3训练自己的数据集
  14. Asterisk修改call file源代码(pbx_spool.c)以支持邀请PJSIP webrtc分机
  15. 达内java培优训练营 2106班
  16. 嵌入式Linux系统的电子书阅读器项目1——Overview
  17. 小程序需要买ssl数字证书吗
  18. CodeForces - 298B Sail (思维题)
  19. 解决SSD+HDD双硬盘下电脑卡顿问题,CPU和内存使用率低,电脑依旧卡顿
  20. 宁以pass-by-reference-to-const替换pass-by-value——effective c++学习笔记

热门文章

  1. leetcode:Add Two Numbers(java)
  2. Linux PAM 验证
  3. linux 扩展pam支持第三方认证
  4. [copy-webpack-plugin] unable to locate的错误解决
  5. Threejs系列--11游戏开发--沙漠赛车游戏【初步加载地面】
  6. 家用路由器AP模式设置
  7. python tkinter Button的使用
  8. 微分几何笔记(2):微分流形的例子
  9. 【23届秋招总结系列】一个普本23届小学弟的秋招总结,上岸金山云开发(云计算方向)
  10. NOIP是什么?全国青少年信息学奥林匹克联赛各区特派员联系名单大全!