代码改变世界

徒手撸设计模式-门面模式

2022-07-14 15:18  hikoukay  阅读(21)  评论(0编辑  收藏  举报

概念

https://www.runoob.com/design-pattern/facade-pattern.html

门面设计模式的核心是降低用户对于复杂子系统的使用难度,即从要知道多个类多个方法的组合使用,
到只需要知道一个类一组方法的使用,降低用户使用的难度,使用门面封装了复杂度。

门面设计模式使用的场景

当存在多个独立的子系统时,执行某些操作可能需要子系统中的一个或者是多个,
对于客户端来说具有一定的复杂度需要了解每个子系统都提供了哪些类,以及使用哪些类来完成操作,
此时就可以考虑使用门面设计模式,使用门面类来封装复杂操作,对客户端只提供一个简单的方法即可。
比如我们常用的日志系统 ,有log4j,log4j2,logback,jul,simplelog等,但是用户在使用时只会使用
其中一种的日志实现,用户只需要使用统一的日志接口就可以了,而不需要关心具体的日志实现都有哪些类,
都有哪些方法,可以参考如下2个图:

 

 

 

 

代码案例

写一个接口,接口方法中包含四个步骤

/**
 * 处理事务接口
 * 1.递交资料
 * 2.验证资料
 * 3.办理业务
 * 4.取回证件
 */
public interface HandleAffairs {
    /**
     * 办理业务门面方法
     */
    void deal();


}

 

三个实现类

/**
 * 政府领救济金
 */
@Service
@Slf4j
public class GovernmentHandleAffairs implements HandleAffairs {

    /**
     * 递交资料
     */
    private void submitInfomtion() {
        log.info("提交身份资料");
    }

    /**
     * 验证资料
     */
    private void verifyInfomation() {
        log.info("办事员验证身份信息");
    }

    /**
     * 办理业务
     */
    private void dealBusiness() {
        log.info("发放救济金");
    }

    /**
     * 取回证件
     */
    private void retrivalDocument() {
        log.info("取回身份证");
    }

    @Override
    public void deal() {
        submitInfomtion();
        verifyInfomation();
        dealBusiness();
        retrivalDocument();
    }
}

 

/**
 * 派出所换新身份证
 */
@Service
@Slf4j
public class PoliceHandleAffairs implements HandleAffairs {
    /**
     * 递交资料
     */
    public void submitInfomtion() {
        log.info("将旧身份证给户籍警察");
    }

    /**
     * 验证资料
     */
    public void verifyInfomation() {
        log.info("户籍警察验证身份证真假");
    }

    /**
     * 办理业务
     */
    public void dealBusiness() {
        log.info("办理新的二代身份证");
    }

    /**
     * 取回证件
     */
    public void retrivalDocument() {
        log.info("拿回旧的身份证");
    }

    @Override
    public void deal() {
        submitInfomtion();
        verifyInfomation();
        dealBusiness();
        retrivalDocument();
    }
}

 

/**
 * 火车站买票
 */
@Service
@Slf4j
public class StationHandleAffairs implements HandleAffairs {
    /**
     * 递交资料
     */
    public void submitInfomtion() {
        log.info("将身份证给售票员");
    }

    /**
     * 验证资料
     */
    public void verifyInfomation() {
        log.info("售票员验证身份证真伪");
    }

    /**
     * 办理业务
     */
    public void dealBusiness() {
        log.info("售票员出票");
    }

    /**
     * 取回证件
     */
    public void retrivalDocument() {
        log.info("售票员将身份证和票给旅客");

    }

    @Override
    public void deal() {
        submitInfomtion();
        verifyInfomation();
        dealBusiness();
        retrivalDocument();
    }
}

 

门面模式门面类

@Component
public class HandleAffairsFacade {
    private /*StationHandleAffairs*/ HandleAffairs stationHandleAffairs;
    private /*PoliceHandleAffairs*/ HandleAffairs policeHandleAffairs;
    private /*GovernmentHandleAffairs*/ HandleAffairs governmentHandleAffairs;

    public HandleAffairsFacade() {
        //创建业务实现类,多态实现,父类引用指向子类对象
        this.governmentHandleAffairs=new GovernmentHandleAffairs();
        this.policeHandleAffairs=new PoliceHandleAffairs();
        this.stationHandleAffairs=new StationHandleAffairs();
    }

    /**
     * 办理身份证
     */
    public void applyCard(){
        policeHandleAffairs.deal();
    }

    /**
     * 办理身份证然后申领救济金
     */
    public void applyCardThenApplyMoney(){
        policeHandleAffairs.deal();
        governmentHandleAffairs.deal();
    }
    /**
     * 办理身份证,然后申领救济金,然后买火车票
     */
    public void applyCardThenApplyMoneyThenBuyTicket(){
        policeHandleAffairs.deal();
        governmentHandleAffairs.deal();
        stationHandleAffairs.deal();
    }
}

 

控制器中调用

@RestController
@RequestMapping("/designPattern")
@Slf4j
public class DesignController {
    /**
     * 引入处理事务门面模式
     */
    @Autowired
    private HandleAffairsFacade handleAffairsFacade;
    
    @GetMapping("/facadeHandelAffairs")
    public  ResponseModel facadeHandelAffairs(){
        handleAffairsFacade.applyCard();
        log.info("***************************");
        handleAffairsFacade.applyCardThenApplyMoney();
        log.info("***************************");
        handleAffairsFacade.applyCardThenApplyMoneyThenBuyTicket();
        log.info("***************************");
        return new ResponseModel("事务处理完成", 200, "请查看日志");

    }
}

 

测试案例