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

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

相关推荐
哪 吒6 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10226 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神9 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术10 小时前
23种设计模式速记法
设计模式
小白不太白95011 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白95011 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i11 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
小白不太白95018 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus20 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大20 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式