1、外观模式介绍
Facade模式也叫外观模式,是由GoF提出的23种设计模式种的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面。这个一致的简单的界面被称为facade。
引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。2、结构图
用户只用和一个类去打交道,至于最终对这个行为产生反应的类,可以交给我们的Facade这个类去完成,由他去实现这些复杂的行为。
结构图如下:
3、角色和职责
Facade为调用方定义简单的调用接口
Clients
调用者,通过Facade接口调用提供某种功能的内部类群。
Packages
功能提供者,指的是提供功能的类群(模块或子系统)。
4、代码示例
先看看每个子系统的代码,三个系统,是一样的,就不重复了,只提供一个:
public class SystemOne {
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("---这里是1号系统---");
}
}
调用接口代码如下:
public class Facade {
private SystemOne one;
private SystemTwo two;
private SystemThree three;
public Facade() {
// TODO Auto-generated constructor stub
one = new SystemOne();
two = new SystemTwo();
three = new SystemThree();
}
public void doABC(){
one.doSomething();
two.doSomething();
three.doSomething();
}
public void doAB(){
one.doSomething();
two.doSomething();
}
}
测试案例:
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1、普通调用
SystemOne one = new SystemOne();
one.doSomething();
SystemTwo two = new SystemTwo();
two.doSomething();
SystemThree three = new SystemThree();
three.doSomething();
// 2、调用外观模式
Facade facade = new Facade();
facade.doABC();
facade.doAB();
}
}
5、优缺点
对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。Facade模式的缺点
1) 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
2) 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
6、总结
如果有股民,应该懂得什么叫基金,在基金出现之前,股民买卖股票需要自己去看,买什么,而有了基金之后,可以不需要过分关注股票,直接在基金那里购买就行了,基金会帮你去处理。基金就在这里担任了一个Facade的角色。一个插排的开关可以控制插入在上面的众多电器设备,该插排的总开关可以同时控制上述所有电器设备,插排开关即为该系统的外观模式设计。
根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。