您当前的位置: 首页 > 
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

沙漠一只雕得儿得儿 发布时间:2020-07-12 15:49:49 ,浏览量:0

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

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

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

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

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.1623s