GOF设计模式之外观模式(结构型代理模式)

简介: GOF设计模式之外观模式(结构型代理模式)

🌚什么是外观模式


外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,切客户端调用非常方便,提高了程序的可维护性。


🌚外观模式能干什么


客户端无需知道系统内部的构造和之间的复杂联系,为客户端提供一个类似于‘接待员’一样的角色。或者定义一个系统的统一入口。如下图,在一个复杂的客户端和系统的交互之间没有加以控制,客户端调用想要调用的子系统,使得之间的交互相当复杂。采用外观模式之后是的系统之间的交互很清晰。还有一个就是预防低水平人员带来的风险。🥴

1.png

🌚外观模式优缺点


优点

1、减少系统相互依赖:降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。


2、提高灵活性:降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。


3、提高了安全性:对客户屏蔽了子系统组件的内部构造和逻辑。


缺点

1、不符合开闭原则,增加新的子系统可能需要修改外观类或客户端的源代码(特殊情况下会很麻烦),继承重写都不合适。


2、不能很好地限制客户使用子系统类,很容易带来未知风险。


🌚外观模式组成部分


外观(Facade)角色:为多个子系统对外提供一个共同的接口,客户端调用时负责将请求发送到对应的子系统进行处理。

子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。可以为1个类(这种情况很少),或者是一个类集合,对子系统而言,外观角色相当于来类型的客户端,子系统并不关心外观角色,只是处理外观角色委派过来的请求。

客户(Client)角色:通过一个外观角色访问各个子系统的功能。

🌚辅助图示


1.png


🌚示例代码


1、外观角色(Facade)

public class Facade {
    private SubSystemA subSystemA = new SubSystemA();
    private SubSystemB subSystemB = new SubSystemB();
    private SubSystemC subSystemC = new SubSystemC();
    public void doUserlogin(Object ...userParams) {
        System.out.println("user do log in。。。");
        subSystemA.MethodA();
        subSystemB.MethodB();
        subSystemC.MethodC();
        System.out.println("user do log in success。");
    }
    public void doUserShopping(Object ...userParams) {
        System.out.println("user start shopping。。。");
        subSystemA.MethodAV2();
        subSystemB.MethodBV2();
        subSystemC.MethodCV2();
        System.out.println("user Shopping success。");
    }
}

2、子系统角色(Sub System)

public class SubSystemA {
    public void MethodA() {
        //业务实现代码
        System.out.println("do check user info。。。");
    }
    public void MethodAV2() {
        //业务实现代码
        System.out.println("check shop num...");
    }
}
public class SubSystemB {
    public void MethodB() {
        //业务实现代码
        System.out.println("do user risk assessment and control。。。");
    }
    public void MethodBV2() {
        //业务实现代码
        System.out.println("user payment。。。");
    }
}
public class SubSystemC {
    public void MethodC() {
        //业务实现代码
        System.out.println("check users can log in。。。");
    }
    public void MethodCV2() {
        //业务实现代码
        System.out.println("user order creation。。。");
    }
}

3、客户端(Client)

public class TestClient {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.doUserlogin();
        System.out.println("--------------------");
        facade.doUserShopping();
    }
}

运行结果

user do log in。。。
do check user info。。。
do user risk assessment and control。。。
check users can log in。。。
user do log in success。
--------------------
user start shopping。。。
check shop num...
user payment。。。
user order creation。。。
user Shopping success。
相关文章
|
2月前
|
设计模式 API 数据安全/隐私保护
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
外观模式是一种关键的设计模式,旨在通过提供一个简洁的接口来简化复杂子系统的访问。其核心价值在于将复杂的内部实现细节封装起来,仅通过一个统一的外观对象与客户端交互,从而降低了系统的使用难度和耦合度。在软件开发中,外观模式的重要性不言而喻。它不仅能够提高代码的可读性、可维护性和可扩展性,还能促进团队间的协作和沟通。此外,随着业务需求和技术的发展,外观模式能够适应变化,通过修改外观对象来灵活调整客户端与子系统之间的交互方式。总之,外观模式在软件设计中扮演着举足轻重的角色,是构建高效、稳定且易于维护的软件系统的关键
70 1
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
|
2月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
30 1
|
2月前
|
设计模式 JavaScript Java
设计模式——代理模式
一文讲清楚设计模式中的代理模式
25 0
设计模式——代理模式
|
2月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
24 2
|
15天前
|
设计模式 Go 网络安全
[设计模式 Go实现] 结构型~代理模式
[设计模式 Go实现] 结构型~代理模式
|
15天前
|
设计模式 Go
[设计模式 Go实现] 结构型~装饰模式
[设计模式 Go实现] 结构型~装饰模式
|
15天前
|
设计模式 Go
[设计模式 Go实现] 结构型~适配器模式
[设计模式 Go实现] 结构型~适配器模式
|
1月前
|
设计模式 缓存 Java
23种设计模式,代理模式的概念优缺点以及JAVA代码举例
4月更文挑战第7天】代理模式是一种常用的软件设计模式,它为其他对象提供一种代理以控制对这个对象的访问。这种模式创建具有原始对象相同接口的对象,从而使代理对象在访问者和目标对象之间作为一个中介。
15 0
|
2月前
|
设计模式 uml
设计模式之外观模式
设计模式之外观模式
|
2月前
|
设计模式 uml
设计模式之代理模式
设计模式之代理模式