设计模式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可以直接运行。

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

相关推荐
杯莫停丶26 分钟前
设计模式之:命令模式
设计模式·命令模式·1024程序员节·活动勋章
电子科技圈3 小时前
芯科科技推出智能开发工具Simplicity Ecosystem软件开发套件开启物联网开发的新高度
mcu·物联网·设计模式·软件工程·软件构建·iot·1024程序员节
WaWaJie_Ngen3 小时前
【设计模式】组合模式(Composite)
设计模式·组合模式·1024程序员节
WaWaJie_Ngen5 小时前
【设计模式】装饰器模式(Decorator)
设计模式·装饰器模式
YuanlongWang5 小时前
C# 设计模式——观察者
windows·设计模式·c#
亿牛云爬虫专家6 小时前
中间件实现任务去重与精细化分发:设计模式与常见陷阱
设计模式·中间件·爬虫代理·数据抓取·商品信息·数据去重·电商搜索
消失的旧时光-194317 小时前
kmp需要技能
android·设计模式·kotlin
JohnYan1 天前
安全密钥(Security Key)和认证技术相关词汇表
后端·安全·设计模式
yinghuaqipao1 天前
面向对象——设计模式(创建型)
android·java·设计模式
WaWaJie_Ngen1 天前
【设计模式】代理模式(Proxy)
设计模式·代理模式