设计模式12——外观模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

外观模式(Facade)

是一种行为型模式。

目录

一、概述

1.1、主要的角色:

1.2、直观的理解外观模式要干什么:

1.3、通过技术实现的角度看,对象之间关系的UML图如下:

二、使用步骤

三、简单举例

3.1、分析步骤:

3.2、对象之间的关系用UML图表示如下:

3.3、Java实现代码如下:


一、概述

复制代码
1、为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用;
复制代码
2、如在维护一个遗留地大型地难维护和扩展的系统时,就可以开发一个外观模式类,把旧系统复杂的东西封装起来,来提供一个比较简单清晰的接口。

1.1、主要的角色:

主要的角色分两种:

  • 旧系统或子系统等其它可能需要被外观类组合起来的对象
  • 外观类或对象

1.2、直观的理解外观模式要干什么:

假设以前有两种请求情形,每个请求情形都要访问多个不同的子系统,如果每次都要挨个编写访问不同子系统的代码,那么会非常麻烦,所以我们希望使用一个类对象把他们封装起来,这样再请求情形不同时会方便很多。如下:

对于上图来说,相当于外观类新增两个方法,分别访问子系统ABC和BC,也就是对应请求情形1和2,这样请求发起方不用每次都挨个调用每个子系统,而是直接调用外观类对象里已经封装好的方法即可。

1.3、通过技术实现的角度看,对象之间关系的UML图如下:

新的方法1对应请求情形1,新的方法2对应请求情形2。

二、使用步骤

  • 先确定我们不同情形都要访问哪些对象;
  • 使用外观类对这些不同情形要访问对象的访问请求进行封装。

三、简单举例

和上面举例一样,假设现有子系统A、B和C,请求发起者经常要访问A、B和C,又或者只访问B和C。

3.1、分析步骤:

1、分析上述问题:

  • 请求发起者要访问子系统A、B和C,有两种情形:每次要不是访问A、B、C,要不就是访问B、C。

  • 那么我们也可以把这两个情形看成两次大的请求访问,这个大的请求访问由一个个单独访问子系统的请求组成。即:大请求1=访问子系统A+访问子系统B+访问子系统C;大请求2=访问子系统B+访问子系统C
    2、针对问题的设计要素:

  • 旧系统或子系统等其它可能需要被外观类组合起来的对象:子系统A、B和C

  • 外观类或对象:外观类

3.2、对象之间的关系用UML图表示如下:

3.3、Java实现代码如下:

(建议你在本地试一下,加深印象)

子系统A:

java 复制代码
public class SubSystemA {
    public void operationA() {
        System.out.println("子系统方法A");
    }
}

子系统B:

java 复制代码
public class SubSystemB {
    public void operationB() {
        System.out.println("子系统方法B");
    }
}

子系统C:

java 复制代码
public class SubSystemC {
    public void operationC() {
        System.out.println("子系统方法C");
    }
}

外观类:

java 复制代码
public class Facade {
    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    private SubSystemC subSystemC;

    public Facade() {
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
        subSystemC = new SubSystemC();
    }

    public void operation1() { //大请求1
        subSystemA.operationA();
        subSystemB.operationB();
        subSystemC.operationC();
    }

    public void operation2() { //大请求2
        subSystemB.operationB();
        subSystemC.operationC();
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation1(); //大请求1
        System.out.println("---------");
        facade.operation2(); //大请求2
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

相关推荐
明戈戈8 小时前
设计模式-模板方法模式
设计模式·模板方法模式
python资深爱好者8 小时前
在什么情况下你会使用设计模式
设计模式
PingCAP12 小时前
Dify + TiDB Vector,快速构建你的AI Agent
数据库·人工智能·设计模式
BoldExplorer13 小时前
设计模式(四)责任链模式
设计模式·责任链模式
GIS_JH14 小时前
设计模式简单示例
设计模式
搬砖的小熊猫15 小时前
设计模式探索:策略模式
设计模式·策略模式
桦说编程18 小时前
深入理解 Future, CompletableFuture, ListenableFuture,回调机制
java·后端·设计模式
spell00720 小时前
设计模式之代理模式
设计模式·代理模式
客院载论20 小时前
秋招突击——设计模式补充——简单工厂模式和策略模式
设计模式
lazy★boy21 小时前
策略模式的应用
设计模式·策略模式