学堂 学堂 学堂公众号手机端

结构性设计模式之门面模式(结构型设计模式实验报告)

lewis 1年前 (2024-04-10) 阅读数 8 #技术

@TOC

门面模式 概述

门面模式(Facade Pattern)又叫外观模式,属于结构性模式。

它提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。


客户端不需要知道系统内部的复杂联系,只需定义系统的入口。即在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

应用场景
为复杂的模块或子系统提供外界访问的模块。

子系统相对独立。 

预防额外操作带来的风险。
目的

降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

优缺点

优点:

减少系统相互依赖。 

提高灵活性。 

提高安全性。

缺点:

不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。也就是说系统可以提供新的功能模块而不必进行修改。
主要角色

门面模式主要包含2种角色:

1.外观角色(Facade):

外观角色也称门面角色,系统对外的统一接口;

2.子系统角色(SubSystem):

可以同时有一个或多个SubSystem。每个SubSytem都不是一个单独的类,而是一个类的集合。

SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)

门面模式的基本使用 创建子系统角色

创建2个创建子系统角色:SubSystemA 与SubSystemB

public class SubSystemA {
    public void subSystem() {
        System.out.println("subSystem A");
    }
}
public class SubSystemB {
    public void subSystem() {
        System.out.println("subSystem B");
    }
}
创建外观角色
public class Facade {
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    /**
     * 提供对外接口
     */
    public void subSystemA() {
        this.a.subSystem();
    }
    /**
     * 提供对外接口
     */
    public void subSystemB() {
        this.b.subSystem();
    }
}
客户端调用
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.subSystemA();
        facade.subSystemB();
    }
门面模式实现商城下单

如商城系统中的下单,下单过程可能涉及多个模块子系统的联动操作,如果分别发送网络请求各个模块子系统的接口,会增加一定复杂度与额外的网络请求。

此时可以采取门面模式,将所有相关接口整合到一个接口中,由后端提供一个接口给前端调用。

假设在一个商城系统中,涉及库存系统、支付系统、物流系统、入口系统。用户下单时进行校验库存,验证支付,最后发货这一整个过程串联起来,提供一个统一接口供客户端调用。

库存系统
public class StockSys {
/**
* 库存校验
*/
public Boolean verify(){
if (Math.random()*10 >5) {
System.out.println("StockSys verify success");
return true;
}
System.out.println("StockSys verify fail");
return  false;
}
}
支付系统
public class PaySys {
/**
* 支付
*/
public Boolean pay() {
if (Math.random()*10 >2) {
System.out.println("PaySys pay success");
return true;
}
System.out.println("PaySys pay fail");
return  false;
}
}
物流系统
public class LogisticsSys {
/**
* 发货
*/
public void ship() {
System.out.println("logistics ship");
}
}
入口系统

public class MySys {
StockSys stockSys = new StockSys();
PaySys paySys = new PaySys();
LogisticsSys logisticsSys = new LogisticsSys();
public void order() {
    if (stockSys.verify()) {
        if (paySys.pay()) {
            logisticsSys.ship();
        }
    }
}

}

## 客户端调用
```java
    public static void main(String[] args) {
        new MySys().order();
    }
StockSys verify success
PaySys pay success
logistics ship

StockSys verify fail

StockSys verify success
PaySys pay fail
版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门