设计模式(十七)—门面模式
最后更新于:2022-04-01 16:26:29
**定义**:(Facada Pattern)要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,
门面模式提供一个高层次的接口,使得子系统更易于使用。
## 一般模式:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340c466ea.jpg)
Facade门面角色
---|客户端可以调用这个角色的方法,此角色知道子系统的所有功能和责任。
subSystem子系统角色
---|可以同时一个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合
子系统并不知道门面的存在,对于子系统而言,门面仅仅是另一个客户端而已。
模型图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340c5f3dc.jpg)
~~~
public class FacadeTest {
public static void main(String[] args) {
//获取门面对象
Facade f = new Facade();
//调用子系统A的方法
f.methodA();
}
}
/**
* 子系统A,在具体的项目中
* 子系统并不是一个类,而是一个类的集合,这里只是简单地
* 以类来代替子系统。
* @author admin
*
*/
class ClassA{
public void doSomethingA(){
System.out.println("子系统A的具体功能...");
}
}
/**
* 子系统A,在具体的项目中
* 子系统并不是一个类,而是一个类的集合,这里只是简单地
* 以类来代替子系统。
* @author admin
*
*/
class ClassB{
public void doSomethingB(){
System.out.println("子系统B的具体功能...");
}
}
/**
* 门面,是外界访问子系统中的具体功能的入口。
* @author admin
*
*/
class Facade{
private ClassA classA = new ClassA();
private ClassB classB = new ClassB();
//提供给外部访问子系统的方法
public void methodA(){
this.classA.doSomethingA();
}
//提供给外部访问子系统的方法
public void methodB(){
this.classB.doSomethingB();
}
}
~~~
## 一个例子:
邮寄一封信要经过一下四个步骤:写信的内容、信的封面、封好、投递到邮箱。
这写必要的步骤相当于一个系统,客户端可以通过门面类来调用这个系统的方法。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340c7a085.jpg)
~~~
public class FacadeT {
public static void main(String[] args) {
//获取门面类
ModenPostOffice mpo = new ModenPostOffice();
mpo.sendMessage("您好!\nOracle,I want to change the world including my lover!", "2020年的我!");
}
}
interface ILetterProcess{
//写信的内容
void wirteLetter(String context);
//信的封面
void fillEnvelope(String address);
//装封好信件
void letterInotoEnvolope();
//投递到邮箱
void sendLetter();
}
/**
* 信件方法的具体实现类,子系统内部的某个类。
* @author admin
*
*/
class LetterProcessImpl implements ILetterProcess{
@Override
public void wirteLetter(String context) {
System.out.println("信件的内容是:"+context);
}
@Override
public void fillEnvelope(String address) {
System.out.println("信件的地址是:"+address);
}
@Override
public void letterInotoEnvolope() {
System.out.println("装封好了信件...");
}
@Override
public void sendLetter() {
System.out.println("发送信件...");
}
}
/**
* 门面类,为外部系统访问内部系统提供接口。
* @author admin
*
*/
class ModenPostOffice{
private ILetterProcess letter = new LetterProcessImpl();
//
public void sendMessage(String context,String address){
//先写好信
this.letter.wirteLetter(context);
//在写好地址
this.letter.fillEnvelope(address);
//找到邮局,投递信件
this.letter.letterInotoEnvolope();
//发送信件
this.letter.sendLetter();
}
}
~~~
**门面模式的优点:**
---|减少系统的相互依赖
---|提高灵活性
---|提高安全性
**门面模式的缺点:**
---|不符合开闭原则
**门面模式的使用场景**
---|为一个复杂的模块或子系统提供一个共外界访问的接口
---|子系统相对独立---外界对子系统的访问只要黑箱操作即可
---|预防低水平人员带来的风险扩散