C++面向对象高级编程(侯捷)——OO部分(二)

Delegation(委托) + Inheritance(继承)

1. 一个经典的例子,对于一个文档来说,可以同时有多个窗口去观察他。这些观察方式可以是相同的,也可以是不同的,比如对于同一组数据,我们可以开三个窗口,一个显示数据的柱状图,一个显示数据的饼状图,一个显示数据的表格。那么这样的设计应该如何实现呢?下面就是这种设计的一种经典解法,也是经典设计模式中的一种:观察者模式

C++面向对象高级编程(侯捷)——OO部分(二)

class Subject就是表示数据的类,它和class Observer是委托的关系,也就是class Subject中放的是一堆class Observer的指针。里面有三个函数,attach负责绑定观察者和数据,在逻辑上简单地把观察者的指针放到class Subject的观察者指针容器中即可;set_val负责改变数据的值,当然数据值改变以后就得“通知”所有观察者,所以还有一个notify函数,在逻辑上就是调用每一个观察者的update函数。观察者可以拥有继承关系,观察者类的继承关系会使这个设计更为强大,所以update函数被设计为虚函数(在本例中是纯虚函数)

2. 另一个经典的例子:假如现在要实现一个文件系统,文件可以互相组合到一个目录下面,而目录又可以和其他目录或者其他文件一起组合到一个新的目录下面,那么这样应该如何设计呢?一种经典的解法如下图所示:这也是经典设计模式之一:组合模式(composite pattern)

C++面向对象高级编程(侯捷)——OO部分(二)

为“文件”class Primitive和“目录”class Composite定义一个共同的父类class Component。class Composite中包含一个元素是父类指针的一个容器,所以Composite中就既可以添加Composite也可以添加Primitive。父类中的add函数应该定义为虚函数,但是不能定义为纯虚函数,因为class Primitive在逻辑上并没有一个叫做add的动作,所以父类中的add可以定义为一个空的虚函数。

3. 最后一个例子,原型模式(prototype pattern)不是特别理解

C++面向对象高级编程(侯捷)——OO部分(二)