命令模式(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("苹果");
}
}
从测试类中,我们可以看到买家、快递公司、卖家的关系。
卖家持有快递公司对象,快递公司持有买家对象,当卖家发送送货指令后,快递公司就开始运输货物,最后把货物送到买家手中。在货物运输过程中,卖家和买家没有实际接触,还是那句话,这就达到了解耦的效果。
输出结果:
卖家寄出商品:苹果
快递公司运输商品:苹果
买家收到商品:苹果
类关系图: