写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的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:
public class SubSystemA {public void operationA() {System.out.println("子系统方法A");}
}
子系统B:
public class SubSystemB {public void operationB() {System.out.println("子系统方法B");}
}
子系统C:
public class SubSystemC {public void operationC() {System.out.println("子系统方法C");}
}
外观类:
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() { //大请求1subSystemA.operationA();subSystemB.operationB();subSystemC.operationC();}public void operation2() { //大请求2subSystemB.operationB();subSystemC.operationC();}
}
主程序(发起请求的类):
public class Main {public static void main(String[] args) {Facade facade = new Facade();facade.operation1(); //大请求1System.out.println("---------");facade.operation2(); //大请求2}
}
这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。
如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!