名称
外观模式(Facade)
意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
动机
将一个系统划分成为若干个子系统,有利于降低系统的复杂性。一个常见的设计目的时使得子系统间的通信和相互依赖关系达到最小。达到这个目标的途径之一就是引入一个外观(Facade)对象,它为子系统中较为一般的设施提供了一个单一而简单的界面。
适用性
- 当要为一个复杂子系统提供一个简单的接口的时候,子系统往往因为不断演化而百年的越来越复杂。
- 客户程序与抽象类的实现部分存在很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
- 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间时相互依赖的,你可以让他们通过Facade进行通信,从而简化他们之间的依赖关系。
结构
参与者
- Facade
- 知道哪些子系统类负责处理请求
- 将客户的请求代理给适当的子系统对象
- Subsystem
- 实现子系统的功能
- 处理由Facade对象指派的任务
- 没有Facade的任何信息,即没有指向Facade的指针
协作
- 客户程序通过发送请求给Facade的方式与子系统通信,Facade将这些消息转发给适当的子系统对象,尽管是子系统中关于对象在做实际工作,但是Facade模式本身也必须将他的接口转换为子系统的接口。
- 使用Facade的客户程序不需要直接访问子系统对象。
效果
优点
- 对客户屏蔽子系统组件,因而减少客户处理对象的数目并使得子系统使用起来更加方便。
- 实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
- 如果应用需要,它并不限制他们使用子系统类,因此你可以在系统易用性和通用性之间进行选择。
示例代码
package abc;
interface ServiceA {
public void methodA() ;
}
class ServiceAImpl implements ServiceA {
@Override
public void methodA() {
System.out.println( "this is method of serviceA" );
}
}
interface ServiceB {
public void methodB() ;
}
class ServiceBImpl implements ServiceB {
@Override
public void methodB() {
System.out.println( "this is method of serviceB" );
}
}
class Facade {
private ServiceA sa;
private ServiceB sb;
public Facade() {
sa = new ServiceAImpl();
sb = new ServiceBImpl();
}
public void funcationA() {
sa.methodA();
}
public void funcationB() {
sb.methodB();
}
}
public class Client{
public static void main(String[]args) {
Facade facade = new Facade();
facade.funcationA();
facade.funcationB();
}
}
输出结果:
this is method of serviceA
this is method of serviceB