6

结构性设计模式之门面模式_积跬步,至千里。的技术博客_51CTO博客

 2 years ago
source link: https://blog.51cto.com/u_13494008/5580655
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

结构性设计模式之门面模式

推荐 原创

结构性设计模式之门面模式

门面模式(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();
            }
        }
    }
}

客户端调用

    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

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK