概念
隐藏系统的复杂性,并向客户端提供了一个可以访问系统的接口的结构型设计模式。
角色
抽象外观角色:定义向客户端提供的接口。
具体外观角色:实现抽象外观角色。
子系统角色:实现子系统的功能,也可以是外观角色。
Code
比如我们开电脑,只要打开电源键就可以,但是电脑内部却不是,他还启动了CPU、启动内存、启动硬盘等等。这就是一个外观模式。电脑就相当于具体外观角色。
抽象外观角色
public abstract class AbsFacade {
public abstract void showMessage();
}
具体外观角色
public class Facade extends AbsFacade{
private Sub1 sub1;
private Sub2 sub2;
private Sub3 sub3;
public Facade(){
sub1 = new Sub1();
sub2 = new Sub2();
sub3 = new Sub3();
}
@Override
public void showMessage() {
sub1.showMeessage();
sub2.showMessage();
sub3.showMessage();
}
}
子系统角色
public class Sub1 {
public void showMeessage(){
System.out.println("start 1");
}
}
public class Sub2 {
public void showMessage(){
System.out.println("start2");
}
}
public class Sub3 {
public void showMessage(){
System.out.println("sub3");
}
}
客户端测试类
public class FacadeClient {
public static void main(String[] args) {
AbsFacade faced = new Facade();
faced.showMessage();
}
}
The End
这里我们实现抽象外观者,是为了方便替换子系统的,比如,我们要将sub2改成sub4,如果不实现抽象外观者的话,我们就需要修改具体的外观者或客户端源代码,这样就违背了开闭原则。所以新增抽象外观角色。
优点: 减少系统相互依赖、提高灵活性、提高了安全性。
缺点: 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活 性。