客户下单后,最好的流程就是客户完全不去管这个水果是怎么采摘下来的,是怎么包装上去的,又是如何通过快递送货上门的;客户只负责下单,后面的这些服务内部的流程和逻辑完全不需要了解。
下面就引出了外观模式(门面模式):客户只有一个下单的动作,这个动作会触发后面的一系列服务,
首先我们的两个服务:采摘水果服务类、包装服务类:
/**
* 采摘服务
*/
public class PickService {
/**
* 采摘水果
*/
public void doPick(){
//袋子型号
BagAbstraction pickBag = new SmallBag();
//袋子材质
Material material = new Paper();
pickBag.setMaterial(material);
//开始采摘
pickBag.pick();
}
public void doOther(){
System.out.println("其它服务");
}
}
/**
* 包装服务
*/
public class PackService {
/**
* 水果打包:防伪/加固/加急等
*/
public void doPack(){
AbstractFactory factory = new AppleFactory();
//得到包装
Bag bag = factory.getBag();
//现需要增加防伪标识
bag = new CheckedBagDecorator(bag);//防伪功能
bag = new ReinforceBagDecorator(bag);//加固功能
bag = new SpeedDecorator(bag);//加急功能
bag.pack();
}
public void doOther(){
System.out.println("其它服务");
}
}
原始的调用方式为:
/**
* 客户服务一条龙
*/
public class CustomerClient {
public static void main(String[] args){
doOrder();
}
public static void doOrder(){
PickService pickService = new PickService();
PackService packService = new PackService();
//采摘
System.out.println("--------------");
pickService.doPick();
//包装
System.out.println("--------------");
packService.doPack();
//快递
System.out.println("--------------");
}
}
在客户下订单时,需要知道首先调用采摘水果、然后再调用打包服务,最后才是快递服务,送货到家。
使用门面模式改造后:
/**
* 客户服务一条龙
*/
public class CustomerClient {
public static void main(String[] args){
doOrderFacade();
}
public static void doOrderFacade(){
OrderFacade orderFacade = new OrderFacade();
orderFacade.doOrder();
}
}
添加的门面类,就是把这个流程写好的类:
/**
* 客户服务一条龙
*/
public class OrderFacade {
private PickService pickService;
private PackService packService;
public OrderFacade(){
pickService = new PickService();
packService = new PackService();
}
/**
* 客户订单处理类
*/
public void doOrder(){
//采摘
System.out.println("--------------");
pickService.doPick();
//包装
System.out.println("--------------");
packService.doPack();
//快递
System.out.println("--------------");
System.out.println("本次快递目的地:北京-朝阳区-三里屯");
}
}
客户端最终只需要调用一次doOrder()即可完成后续流程的服务。