结构型设计模式之--外观(门面)模式

客户下单后,最好的流程就是客户完全不去管这个水果是怎么采摘下来的,是怎么包装上去的,又是如何通过快递送货上门的;客户只负责下单,后面的这些服务内部的流程和逻辑完全不需要了解。

下面就引出了外观模式(门面模式):客户只有一个下单的动作,这个动作会触发后面的一系列服务,

首先我们的两个服务:采摘水果服务类、包装服务类:

/**
 * 采摘服务
 */
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()即可完成后续流程的服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值