外观模式
记得有一次,我们一起去了一个别墅轰趴,那时候大家都去玩自己想玩的事情,大厅开灯是必须的,看电影的要去小房间开投影仪幕布,玩游戏的要开电脑或者xbox等等。
最后玩的筋疲力尽了还要一个个去把他们关掉,那时候就在想如果有一个按钮关掉或者开启所有多好。
直到今天看了外观模式才知道,那个想法就是一个外观模式的思想,把所有开启和关闭的功能全部集中在一个按钮上,我们不需要一个个开启也不需要知道如何开启,只用按一下按钮就能开启关闭。
外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
单单看定义其实我也没有很明白,不过看过例子后我突然想起了,我的那次亲身经历。
可以把电脑、灯、xbox等等看成一组,然后我的想法中的那个按钮就是这个一致的界面,通过这个按钮可以方便我们更加方便的开关它们,而不用在跑到一个个房间去检查有没有关掉。
根据上面的想法就很容易看出外观模式的两个角色了:
外观角色(Facade): 为子系统提供一个共同的对外接口,就是上面我想象中的按钮。
子系统角色(SubSystem):实现子系统的功能,就是上面说的电脑、Xbox等。
来看一下UML图
这样就更加简单明了了,Client完全可是看成人,facade就是我想法中的按钮了,那么剩下的子系统类就是电脑、灯、xbox等东西了。下面我们来看下代码实现
class Xbox{
public void start(){
System.out.println("开启Xbox");
}
public void close(){
System.out.println("关闭Xbox");
}
}
class Light{
public void start(){
System.out.println("开启大厅灯");
}
public void close(){
System.out.println("关闭大厅灯");
}
}
class Computer{
public void start(){
System.out.println("开启电脑");
}
public void close(){
System.out.println("关闭电脑");
}
}
class DreamButton{
Xbox xbox;
Computer computer;
Light light;
public DreamButton(){
xbox=new Xbox();
computer=new Computer();
light=new Light();
}
public void allStart(){
xbox.start();
computer.start();
light.start();
}
public void allClose(){
xbox.close();
computer.close();
light.close();
}
}
public class Client {
public static void main(String[] args) {
DreamButton button=new DreamButton();
button.allStart();
button.allClose();
}
}
这样子就是通过一个按钮可以解决电器的关闭问题,而不用再去房间里检查哪些东西忘记关闭了。
运用外观模式的好处是:
不需要在去亲自开关电器,放在代码里面来讲就是实现了松耦合的关系
还有一点是现实没有的,实现了依赖倒转和迪米特法则,好处就不在重复
同样的有好就有坏:
如果我还想把空调等电器加入控制,那么我就需要重新设置按钮功能,也是说在代码里面我需要去修改DreamButton这个类,违反了开闭原则。