命令模式14,有代码有真相

[ 1023 查看 / 0 回复 ]

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace _14Command
  6. {
  7.     //客户类,调用者
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //new Service().ProviderCook();

  13.             Service cook = new Service();
  14.             cook.修改烧烤策略("烧烤鸡翅");
  15.             cook.ProviderCook();
  16.         }
  17.     }

  18.     //服务员类,invoker
  19.     class Service
  20.     {
  21.         //c#暂时不知道有类似java匿名内部类的用法

  22.         //一个命令是简化,可以是一组命令对应一组接收,具体的视业务逻辑而定
  23.         private Command cmd = null;
  24.         private Reciever reciever = null;

  25.         //变化点
  26.         public Service()
  27.         {
  28.             cmd = new DefaultCommand();
  29.             reciever = new DefaultReciever();
  30.         }

  31.         //修改cmd和reciever指针指向的策略
  32.         //结合策略模式,动态的修改烧烤的策略(想换什么策略都可以);加上反射,符合 OCP 开闭 的设计原则
  33.         public void 修改烧烤策略(string 烧烤类别)
  34.         {
  35.             System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("14Command");
  36.             cmd = assembly.CreateInstance("_14Command." + 烧烤类别 + "Command") as Command;
  37.             reciever = assembly.CreateInstance("_14Command." + 烧烤类别 + "Reciever") as Reciever;
  38.         }

  39.         public void ProviderCook()
  40.         {
  41.             cmd.Cook = reciever;
  42.             cmd.执行命令();
  43.         }
  44.     }

  45.     //命令父类
  46.     abstract class Command
  47.     {
  48.         private Reciever cook;

  49.         internal Reciever Cook
  50.         {
  51.             get { return cook; }
  52.             set { cook = value; }
  53.         }
  54.         public virtual void 执行命令()
  55.         {
  56.             Console.WriteLine("如果没有特殊指定,我将烧烤的是鸡心");
  57.             cook.烧烤();
  58.         }

  59.     }

  60.     //命令的reciever,厨师父类
  61.     abstract class Reciever
  62.     {
  63.         public virtual void 烧烤()
  64.         {
  65.             Console.WriteLine("如果不指定具体的厨师,则派我家最有名的大厨掌勺");
  66.         }

  67.     }
  68.     //具体Command子类,先是默认实现
  69.     class DefaultCommand : Command { }

  70.     //具体Reciever子类,先是默认实现
  71.     class DefaultReciever : Reciever { }

  72.     //具体Command子类,烧烤鸡翅
  73.     class 烧烤鸡翅Command : Command
  74.     {
  75.         public override void 执行命令()
  76.         {
  77.             //base.执行命令();
  78.             Console.WriteLine("这次的命令是烧烤鸡翅");
  79.             base.Cook.烧烤();
  80.         }
  81.     }

  82.     //具体Reciever子类,烧烤鸡翅
  83.     class 烧烤鸡翅Reciever : Reciever
  84.     {
  85.         public override void 烧烤()
  86.         {
  87.             Console.WriteLine("我是小王师傅,专门负责烧烤鸡翅");
  88.             //base.烧烤();
  89.         }
  90.     }

  91.     //具体Command子类,烧烤鸡腿
  92.     class 烧烤鸡腿Command : Command { }

  93.     //具体Reciever子类,烧烤鸡腿
  94.     class 烧烤鸡腿Reciever : Reciever { }


  95. }
复制代码
1

评分次数

    TOP