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

“最少知识”原则
最少知识(Least Knowledge)原则告诉我们要减少对象之间的交互,只留下几个“密友”。这个原则通常是这么说的:
设计原则
最少知识原则:只和你的密友谈话
这到底是什么意思?这是说,当你正在设计一个系统,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类是如何交互的。
这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响其他部分。如果需要类之间相互依赖,那么这个系统就会变成一个不容易维护的系统,它需要花很多成本维护,也会因为太复杂而不容易被其他人了解。
甜蜜的家庭影院
通过一番研究比较,你组装了一套杀手级的系统,内含DVD播放器、投影机、自动屏幕、环绕立体声,甚至还有爆米花机。
看看这些组件的组成:

你花了好几个星期布线、挂上投影机、连接所有的装置并进行微调。现在,你准备开始享受一部电影......
挑选一部DVD影片,放松,开始感受电影的魔幻魅力。
哎呀!忘了一件事:想看电影,必须先执行一些任务。
打开爆米花机
开始爆米花
将灯光调暗
放下屏幕
打开投影机
将投影机的输入切换到DVD
将投影机设置在宽屏模式
打开功放
将功放的输入设置为DVD
将功放设置为环绕立体声
将功放音量调到中(5)
打开DVD播放器
开始播放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设计模式》,更多模式相关文章将后续发布,敬请关注!




