暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设计模式之外观模式

四阿哥胤禛 2019-04-07
287

说明

外观模式  提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。


类图

最少知识”原则

最少知识(Least Knowledge)原则告诉我们要减少对象之间的交互,只留下几个“密友”。这个原则通常是这么说的:

设计原则     

最少知识原则:只和你的密友谈话

这到底是什么意思?这是说,当你正在设计一个系统,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类是如何交互的。


这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响其他部分。如果需要类之间相互依赖,那么这个系统就会变成一个不容易维护的系统,它需要花很多成本维护,也会因为太复杂而不容易被其他人了解。


甜蜜的家庭影院

通过一番研究比较,你组装了一套杀手级的系统,内含DVD播放器、投影机、自动屏幕、环绕立体声,甚至还有爆米花机。

看看这些组件的组成:

你花了好几个星期布线、挂上投影机、连接所有的装置并进行微调。现在,你准备开始享受一部电影......

挑选一部DVD影片,放松,开始感受电影的魔幻魅力。

哎呀!忘了一件事:想看电影,必须先执行一些任务。

  1. 打开爆米花机

  2. 开始爆米花

  3. 将灯光调暗

  4. 放下屏幕

  5. 打开投影机

  6. 将投影机的输入切换到DVD

  7. 将投影机设置在宽屏模式

  8. 打开功放

  9. 将功放的输入设置为DVD

  10. 将功放设置为环绕立体声

  11. 将功放音量调到中(5)

  12. 打开DVD播放器

  13. 开始播放DVD


让我们将这些任务写成类和方法的调用

    //打开爆米花机,开始爆米花
    popper.pop();
    popper.pop();
    //灯光调暗到10%的亮度
    lights.dim(10);
    //把屏幕放下
    scree.down();
    //打开投影机,并将它设置在宽屏模式......
    projector.on();
    projector.setInput(dvd);
    projector.wideScreenMode();
    //打开功放,设置为DVD,调整成环绕立体声模式,音量调到5......
    amp.on();
    amp.setDvd(dvd);
    amp.setSurroundSound();
    amp.setVolume(5);
    //打开DVD播放器...... "终于"可以看电影了!
    dvd.on();
    dvd.play(movie);

    但不只是这样... ...

    • 看完电影后,你还要把一切都关掉,怎么办?难道要反向的把这一切动作再进行一次?

    • 如果要听CD或者广播,难道也会这么麻烦?

    • 如果你决定要升级你的系统,可能还必须重新学习一套稍微不同的操作过程


    怎么办?使用你的家庭影院竟变得如此复杂!让我们看看外观模式如何解决这团混乱,好让你能轻易的享受电影... ...

    现在,客户端代码可以调用此家庭影院外观所提供的方法,而不必再调用这个子系统的方法。所以,想要看电影,我们只要调用一个方法(也就是watchMovie())就可以了。

    外观只是提供你更直接的操作,并未将原来的子系统阻隔起来。如果你需要子系统类的更高层功能,还是可以使用原来的子系统。


    问:还有另一个原则,叫做得墨忒耳法则(Law of Demeter),它和最少知识原则有什么关系?


    答: 其实两个名词指的是同一个原则。我们倾向于使用最少知识原则来称呼它是因为一下两个原因:(1)这个名字更直接。(2)法则(Law)给人的感觉是强制的。事实上,没有任何原则是法律(Law)。所有的原则都应该在有帮助的时候才遵守。所有的设计都不免需要折中(在抽象和速度之间取舍,在空间和时间之间平衡......)。虽然原则提供了方针,但在原则之前,必须全盘考虑所有的因素。



    问:采用最少知识原则有什么缺点吗?


    答: 是的,虽然这个原则减少了对象之间的依赖,研究显示这会减少软件的维护成本;但是采用这个原则也会导致更多的“包装”类被制造出来,以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增加,并降低运行时的性能。



    本文内容取自《Head First设计模式》,更多模式相关文章将后续发布,敬请关注!

    文章转载自四阿哥胤禛,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论