设计模式-行为型-命令模式

80 阅读2分钟

定义

大话设计模式[命令模式]:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

实现

里面有一些需要注意的点:

  1. 具体的命令实现类:接⼝口类的具体实现,可以是⼀一组相似的⾏行行为逻辑
  2. 实现者:也就是为命令做实现的具体实现类
  3. 调⽤用者:处理理命令、实现的具体操作者,负责对外提供命令服务

下面使用饭店点单的案例来学习一下命令的模式的使用。

流程

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 臃肿代码的操作,但是如果这种情况很多,那么自身也会造成类膨胀的问题。