单一职责原则
定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
里氏替换原则
定义:所有引用基类的地方必须能透明地使用其子类的对象。
依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
迪米特法则
定义:一个对象应该对其他对象保持最少的了解。
开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
所谓的命令模式,就是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
打个比喻说,如果你去餐厅吃饭,点了一个红烧茄子,那么服务员就会记下你点了什么菜,但是又没有这个菜,和这个菜怎么做他是不知道的
他只是一个消息的传递者
首先创建一个用来执行命令的接口,这个接口会被相关的实现类所实现,毕竟这个是拿来用的0-0
interface ICommand { void Exec();//执行命令 }
接着就什么一个具体执行,或者接受命令的人
class ChuShi { public void ExecQieZhi() { System.Console.WriteLine("炒一个茄子0-0"); } public void ExecTuDou() { System.Console.WriteLine("炒一个土豆0-0"); } }
知道由谁来执行上面定义接口的命令了,那么我们就需要创建相对应的命令了,因为上面的命令都还没有实现
在这个类里面,只需要知道命令的执行者是谁就可以了,他只是用来传递消息的,毕竟,真正怎么做,还得厨师才知道
class QieZhi:ICommand { ChuShi chushi; public QieZhi(ChuShi s) { this.chushi=s; } public void Exec() { chushi.ExecQieZhi(); } }
-------------------------在创建一个
class TuDou:ICommand { ChuShi chushi; public TuDou(ChuShi s) { this.chushi=s; } public void Exec() { chushi.ExecTuDou(); } }
那么现在,命令也有了,执行者也有了,我们是不是就可以执行程序了呢?
答案是肯定的
但是这样做有一点不好,不可以重复的利用命令类,因为每次我们点了一个土豆就要实例化一个土豆,
所以,我们有了一个服务员的类,
class wariter { ICommand ic=null;//引用命令接口 public wariter() { } public void DianCai(ICommand ic)//点菜 { this.ic = ic; } public void exec()//通知厨师炒菜 { if (ic!=null) { this.ic.Exec(); } } }
所以现在点菜就变成这个样子了
但是这样做,又有一个不好的地方,如果我要点十个茄子了 0-0,那我不就的让服务员跑10次去通知厨师炒菜?
所以代码又变成了这样
class wariter { List<ICommand> Icom = new List<ICommand>(); //ICommand ic=null; public wariter() { } public void Add(ICommand ic) { this.Icom.Add(ic); } public void Remove(ICommand ic) { this.Icom.Remove(ic); } public void exec() { foreach (var item in Icom) { item.Exec(); } } }
这样,客户就可以点菜和,撤菜了,
执行效果如下