zoukankan      html  css  js  c++  java
  • 设计模式漫谈之命令模式

      有一段时间没有写博客了,中间去广州调研需求一段时间。也是各种曲折,又一次感悟到老程序员最重要的是工作习惯,工作态度,工作经验,这些是新入行的没法比的。因为他们还不知道自己是否要做程序员。

    昨天第一次去女朋友家。还算顺利。最近可心烦,工作上的事,资金上的事。就想写篇博客压压惊,静静心。

    在面向对象的世界里,两个对象想发生任何关系,必须满足,想发生关系的对象可以访问到另一个对象的空间。即A对象想和B对象发生关系,A对象必须存B对象的引用。

    在面向对象的世界里,所有东西都有宿主,方法,属性,事件的宿主是类,类的宿主是模块,模块的宿主是程序集,程序集的宿主是程序域,程序域的数据是进程。

    对象知道其空间里的所有东西,也知道类空间里的东西。

    命令模式,就是对不同的命令对象进行统一的解释。

    直接上例子,我来解释:

    //需要继承的对象,

    //A可以访问B对象,抽象的把关系说清楚

    public abstract class Command
    {

    //子类对象可以访问的关系对象
    protected Barbecuer receiver;

    public Command(Barbecuer receiver)
    {
    this.receiver = receiver;
    }

    //需要具体写的方法
    abstract public void ExcuteCommand();
    }

    //具体的关系对象,对抽象对象负责任的对象,具有对象空间的对象

    class BakeMuttonCommand : Command
    {
    public BakeMuttonCommand(Barbecuer receiver)
    : base(receiver)
    { }

    //重写的方法

    public override void ExcuteCommand()
    {
    receiver.BakeMutton();
    }
    }

    //关系对象

    public class Barbecuer
    {

    //对象中的空间成员
    public void BakeMutton()
    {
    Console.WriteLine("烤羊肉串!");
    }

    //对象中的空间成员方法

    public void BakeChickenWing()
    {
    Console.WriteLine("烤鸡翅!");
    }
    }

    //继续封装,就是向上层继续发生关系

    public class Waiter
    {

    //原则是抽象对抽象
    private IList<Command> orders = new List<Command>();

    //过滤对象
    public void SetOrder(Command command)
    {
    if (command.ToString() == "命令模式.BakeChickenWingCommand")
    {
    Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。");
    }
    else
    {
    orders.Add(command);
    Console.WriteLine("增加订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());
    }
    }


    public void CancelOrder(Command command)
    {
    orders.Remove(command);
    Console.WriteLine("取消订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());
    }


    public void Notify()
    {
    foreach (Command cmd in orders)
    {
    cmd.ExcuteCommand();
    }
    }
    }

    //空间对象

    //发生关系执行关系中的动作

    Barbecuer boy = new Barbecuer();
    Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
    Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
    Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
    Waiter girl = new Waiter();


    girl.SetOrder(bakeMuttonCommand1);
    girl.SetOrder(bakeMuttonCommand2);
    girl.SetOrder(bakeChickenWingCommand1);


    girl.Notify();

    总结:程序员最重要的是编程思想,最后语言只是思想的具体实现。抽象对抽象设计,未来的对象想发生关系,必须能访问到有关系对象的空间。封装就是封装不同对象关系的宿主对象。命令就是动作,动作对应方法,命令模式就是封装方法。所有类型从个数上区分,分单个对象,多个对象类型。

    父亲节最好的礼物,应该是我快订婚了,哈哈

  • 相关阅读:
    4-8(十五)性能测试流程
    数据库面试题(一)多表查询
    4-8(十四) jmeter 性能分析从哪几个方面
    4-8(十二)Jmeter+Ant+Jenkins定时构建
    4-8(十一)Jmeter自动化集成工具Ant的安装
    4-8(十)Jmeter 分布式测试
    4-8(九)Jmeter性能测试之阶梯式场景(负载测试)、波浪式场景(压力测试)
    4-8(八)Jmeter性能测试插件jpgc的安装
    4-8(六)Jmeter 脚本录制后调优
    6分钟演示,15种排序算法(视频)
  • 原文地址:https://www.cnblogs.com/wang-charle/p/9192088.html
Copyright © 2011-2022 走看看