问题的抛出:你组装了一套杀手级的系统用来看电影,内含DVD播放器、投影机、自动屏幕、环绕立体声等.每一次你看电影德1时候都要先经历下面一段痛苦的过程1.将灯光调俺2.放下屏幕3.打开投影机4.将投影的输入切换到DVD......,当你弄完了看电影的热情也就没有了,那么有没有什么可以让我看电影的时候按一下按钮就可以了呢?当然有啊!你可以弄一个遥控啊,这个遥控有个按钮,一按就可以,这个遥控就的操做就那么多操作的外观
定义:提供了一个统一的接口,用来访问子系统的中的一群接口.外观定义了一个高层接口,让子系统更容易使用.
结构组成
Facade:外观角色
SubSustem:子系统角色
案例:将抛出的问题实现了
具体代码如下
/**
* <p> DVD(子系统一) </p>
*
* @author Alemand
* @since 2018/1/30
*/
public interface DVD {
/**
* 播放
*/
void play();
}
/**
* <p> 投影仪(子系统二) </p>
*
* @author Alemand
* @since 2018/1/30
*/
public interface Screen {
/**
* 放下投影仪
*/
void drop();
}
/**
* <p> 音响(子系统三) </p>
*
* @author Alemand
* @since 2018/1/30
*/
public interface Voice {
/**
* 调节声音
*/
void adjust();
}
/**
* <p> 遥控器(外观角色) </p>
*
* @author Alemand
* @since 2018/1/30
*/
public class Telecontrol {
/**
* dvd
*/
private DVD dvd;
/**
* 投影仪
*/
private Screen screen;
/**
* 音响
*/
private Voice voice;
public Telecontrol(DVD dvd, Screen screen, Voice voice) {
this.dvd = dvd;
this.screen = screen;
this.voice = voice;
}
/**
* 遥控器控制打开
*/
public void turnOn(){
dvd.play();
screen.drop();
voice.adjust();
}
}
优点:
- 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
- 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
- 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
- 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
缺点:
- 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
- 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。