设计思想学习—外观模式

外观模式

记得有一次,我们一起去了一个别墅轰趴,那时候大家都去玩自己想玩的事情,大厅开灯是必须的,看电影的要去小房间开投影仪幕布,玩游戏的要开电脑或者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这个类,违反了开闭原则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值