设计模式之 命令模式

命令模式(Command Design Pattern),是针对请求方和处理方的设计模式,请求方通过调用命令对象,将请求发送到处理方处理,这样做的好处是将请求方和处理方解耦。

举个例子,比如我们现在的网购服务,我从网上向某个商家买了东西,这时候,卖家就委托了快递公司将商品送到了我手里,这里就相当于卖家发送指令给快递公司,快递公司将物品经过运输,送到了买家手里。

通过快递公司发货,好处就是卖家不需要关心货物是怎么运输,经过哪些步骤,才运输到买家手里,这就是实际生活的解耦,将买家和卖家解耦。

我们来看一下具体代码

1、新建抽象卖家类和具体卖家类

package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--抽象卖家
 */
public interface ISaler {

    void receive(String product);
}



package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--卖家
 */
public class Saler implements ISaler{

    @Override
    public void receive(String product) {
        System.out.println("买家收到商品:" + product);
    }
}

2、新建抽象快递公司和具体快递公司

package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--抽象快递员
 */
public interface IExpressman {

    void transport(String product);
}


package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--快递员
 */
public class Expressman implements IExpressman {

    private ISaler saler;

    public Expressman(ISaler saler) {
        this.saler = saler;
    }

    @Override
    public void transport(String product) {
        System.out.println("快递公司运输商品:" + product);
        saler.receive(product);
    }
}

3、新建抽象买家和具体买家

package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--抽象买家
 */
public interface IBuyer {

    void send(String product);
}




package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--买家
 */
public class Buyer implements IBuyer {

    private Expressman em;

    public Buyer(Expressman em) {
        this.em = em;
    }

    @Override
    public void send(String product) {
        System.out.println("卖家寄出商品:" + product);
        em.transport(product);
    }
}

4、测试

package com.itzhimei.study.design.order;

/**
 * www.itzhimei.com
 * 命令模式--测试
 */
public class Client {

    public static void main(String[] args) {
        ISaler saler = new Saler();
        Expressman em = new Expressman(saler);
        IBuyer buyer = new Buyer(em);
        buyer.send("苹果");
    }
}

从测试类中,我们可以看到买家、快递公司、卖家的关系。

卖家持有快递公司对象,快递公司持有买家对象,当卖家发送送货指令后,快递公司就开始运输货物,最后把货物送到买家手中。在货物运输过程中,卖家和买家没有实际接触,还是那句话,这就达到了解耦的效果。

输出结果:

卖家寄出商品:苹果
快递公司运输商品:苹果
买家收到商品:苹果

类关系图: