“使用多个专门的接口比使用单一的总接口要好”。
“一个类对另外一个类的依赖性应该建立在最小的接口上”。
陈述:
- 不应该强迫客户依赖于他们不用的方法。
- 一个类的不内聚的“胖接口”应该被分解成多组方法,每一组方法都服务于一组不同的客户程序。
例子:
Door可以加锁、解锁、而且可以感知自己是开还是关;
Door是抽象基类,客户程序可以依赖于抽象而不是具体的实现。
现在我们要增加一个功能:如果门打开时间过长,它就会 警(比如宾馆客房的门)。
设计:为了实现上述新增功能,我们要求Door与一个已有的Timer对象进行交互。
- 如果一个对象希望得到超时通知,它可以调用Timer的Register函数。
- 该函数有两个参数,一个是超时时间,另一个是指向TimerClient对象的指针,此对象的TimerOut函数会在超时时被调用。
问题出来了:我们如何将TimerClient和TimedDoor联系起来 一种常见的解决方案如下:
解决(续):
另一种解决办法是使用多继承:

注意:多重继承的方法,要慎用!在Effective C++中,已经提到了这点。 总结:
- 准确而恰当地划分角色以及角色所对应的接口,是面向对象设计的一个重要组成部分;
- 每个接口都代表一个角色,实现一个接口的对象,因此将角色区分清楚是系统设计的一个重要工作。一个符合逻辑的推断,不应将几个不同的角色都交给同一个接口,而应交给不同的接口。
- 将没有关系的接口合并在一起,形成一个臃肿的大接口,是对角色和接口的污染。
相应设计模式:
Memento
Iterator
参考资源:
《设计模式:可复用面向对象软件的基础》,ERICH GAMMA RICHARD HELM RALPH JOHNSON JOHN VLISSIDES著作,李英军 马晓星 蔡敏 刘建中译,机械工业出版 ,2005.6
《敏捷软件开发:原则、模式与实践》,Robert C. Martin著,邓辉译,清华大学出版 ,2003.9
《设计模式解析》,Alan Shalloway等著(徐言声译),人民邮电出版 ,2006.10
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!