外观模式

1.定义
外观模式也称为门面模式,英文名称是Facade,为子系统的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
外观模式的结构示意图如下:


外观模式_第1张图片

2.适用场景
1)假如您是中间件厂商,负责提供产品。那么客户使用产品的时候可以开发一个Facade类,由Facade类来对您的产品(可视为子系统)的基础功能进行特定的封装,这样客户端代码只需要跟Facade打交道就可以了,实现了解耦和简化子系统使用的双重功效。

2)今天看到介绍本山大叔给村民修路的新闻,就拿这个举例子吧。村民想让本山大叔给修路,本山大叔直接对身边的秘书说这事交给你办了,秘书具体负责联系厂家,监督质量等等各种具体麻烦事,负责跟各种人打交道,这里秘书就可看成是Facade,具体厂家等可以看做是SubSystem。有了Facade多省心,直接给money就可以了。




3.类图

外观模式_第2张图片


1)SubSystemA,SubSystemB,SubSystemC:子系统,子系统不知道Facade,具体任务由子系统负责执行。
2)Facade:外观对象,负责调用具体的子系统来处理任务。
3)FacadeMain:客户端。

5.代码示例
public class SubSystemA {
    public void method(){
        System.out.println("访问子系统A的方法");
    }
}
public class SubSystemB {
    public void method(){
        System.out.println("访问子系统B的方法");
    }
}
public class SubSystemC {
    public void method(){
        System.out.println("访问子系统C的方法");
    }
}
public class Facade {
    public void method(){
        SubSystemA subA = new SubSystemA();
        subA.method();
        SubSystemB subB = new SubSystemB();
        subB.method();
        SubSystemC subC = new SubSystemC();
        subC.method();
    }
}
public class FacadeMain {
    public static void main(String[] args){
        //直接访问子系统
       SubSystemA subA = new SubSystemA();
        subA.method();
        SubSystemB subB = new SubSystemB();
        subB.method();
        SubSystemC subC = new SubSystemC();
        subC.method();
        System.out.println("----------------------");
        //使用外观模式
        Facade facade = new Facade();
        facade.method();
    }
}
输出结果:
访问子系统A的方法
访问子系统B的方法
访问子系统C的方法
----------------------
访问子系统A的方法
访问子系统B的方法
访问子系统C的方法


6.优点
1)它对客户屏蔽了子系统细节,减少了客户需要处理的对象的数目,使得子系统使用起来更加方便。
2)实现了子系统与客户之间的解耦,这样子系统变化只会影响到Facade,而不会影响到客户端。
3)Facade也可以使用在子系统内部的层与层之间。
4)Facade并不会限制客户端使用子系统,客户端也可以绕过Facade,直接访问子系统。




GoF《设计模式》

你可能感兴趣的:(设计模式,Facade,外观模式)