您的位置:首页 > 其它

设计思想学习—外观模式

2018-01-02 18:58 183 查看

外观模式

记得有一次,我们一起去了一个别墅轰趴,那时候大家都去玩自己想玩的事情,大厅开灯是必须的,看电影的要去小房间开投影仪幕布,玩游戏的要开电脑或者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这个类,违反了开闭原则。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息