定义
大话设计模式[命令模式]:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
实现
里面有一些需要注意的点:
- 具体的命令实现类:接⼝口类的具体实现,可以是⼀一组相似的⾏行行为逻辑
- 实现者:也就是为命令做实现的具体实现类
- 调⽤用者:处理理命令、实现的具体操作者,负责对外提供命令服务
下面使用饭店点单的案例来学习一下命令的模式的使用。
流程
if-else 代码
我们可以使用 if-else 来对下单做一个程序,实现很简单,而且代码易懂。但是当各种菜系很多的时候,甚至每个调味不同的时候,if-else 就很扩展了,而且那时候代码也是不可读的,只能堆砌成一个‘大屎山’了。
public class Waiter {
private Map map = new ConcurrentHashMap();
public void order(int type) {
if (1 == type) {
map.put(1, "重庆菜制作");
}
if (2 == type) {
map.put(1, "上海菜制作");
}
}
public void palceOrder(){
System.out.println(map);
}
public static void main(String[] args) {
Waiter waiter=new Waiter();
waiter.order(1);
waiter.palceOrder();
}
}
命令模式改造
首先是一个调用者,对实现者发出命令
public class Waiter {
List<IType> list=new ArrayList<>();
public void order(IType iType){
list.add(iType);
}
public synchronized void placeOrder(){
for(IType i:list){
i.cook();
}
list.clear();
}
}
抽象命令定义(什么菜品):
public interface IType {
void cook();
}
public class SHType implements ICook {
private ICook iCook;
public SHType(ICook iCook) {
this.iCook = iCook;
}
@Override
public void doCooking() {
iCook.doCooking();
}
}
具体命令定义实现:
public interface ICook {
public void doCooking();
}
public class SHCook implements ICook {
@Override
public void doCooking() {
System.out.println("上海风味");
}
}
总结
- 上面我们看到:命令定义(菜品)、具体逻辑实现(厨师)、调用者(服务员),基本就是命令模式的核心了。
- 拆分后,整个框架的代码都是松耦合的,且每个都是单一职责的,菜品和厨师都可以很方便的扩展搭配。
- 这样就能去掉 if-else 方便扩展,但是如果菜品太多,也会造成类膨胀的问题,需要对它们进行管理。
设计模式学习到这里,越来越觉得都是为了可扩展、可阅读、可维护的方向进行的,而且很多都是简化 if-else 臃肿代码的操作,但是如果这种情况很多,那么自身也会造成类膨胀的问题。