欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式漫谈之命令模式

程序员文章站 2022-03-23 13:56:56
有一段时间没有写博客了,中间去广州调研需求一段时间。也是各种曲折,又一次感悟到老程序员最重要的是工作习惯,工作态度,工作经验,这些是新入行的没法比的。因为他们还不知道自己是否要做程序员。 昨天第一次去女朋友家。还算顺利。最近可心烦,工作上的事,资金上的事。就想写篇博客压压惊,静静心。 在面向对象的世 ......

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

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

 

在面向对象的世界里,两个对象想发生任何关系,必须满足,想发生关系的对象可以访问到另一个对象的空间。即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();

 

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

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