类与类的关系
类是C++区别C的最大特性,有了类我们就能够实现封装,继承,和多态这三大特性,同时类与类之间的关系我们分为三种:复合(composition) ,委托(Delegation),继承(inheritance)
一:Composition
复合指的是类A包含类B,也就是A has B;
代码示例:
class B;
class A{
public :
void f(){
b.f();
}
private:
B b;
}
适用情形:假设需要建立的新类B的功能在类A中全部存在,就可以直接使用复合来创建类B,类A成为了类B的一个成员;例如A为queue,B为deque。
构造函数:由内而外,先构造B,再构造A。
析构函数:由外而内,先析构A,再析构B。
二:Delegation
委托指的是类A中的一个成员指向类B
代码示例:
class B;
class A{
public:
A();
~A();
private:
B* b;
}
典型例子就是:pimpl,(编译防火墙)。类A为对外接口。类B为实现类。好处就是如果改变了实现方向,并不需要去改变对外接口,就是如果B更改了,A并不需要更改。对用户而言接口没变。(handle/body)
构造是由内而外
析构是由外而内
http://blog.csdn.net/lihao21/article/details/47610309
三inheritance
继承是a is b 继承有三种方式:public private protected
代码示例
class A{
public :
A(){};
virtual ~A(){};
}
class B : public A
{
}
继承在C++中的使用相当广泛,后面会详细记录。
构造是由内而外
析构是由外而内
通过以上三种类与类的关系组合成不同的解决方案,最著名的有23中OOD方案,下面介绍三种:
一。委托+复合
典型例子就是一个ppt开四个窗口或者一组数据通过不同形式显示出来。对外接口是Subject 用户操作在Subject上,Subject里面有个指向Observe的指针容器。也就是可以调用很多个Observer
,Observer是一个基类,他有很多派生类,都可以放到Subject中的指针容器中,也就能够实现不同的显示形式。
二。Composite
委托加继承
典型的就是文件系统,目录里面可以放文件和文件夹,Primitive代表文件,是指单一的文件,Composite代表文件夹,可以包含很多文件和文件夹。
三.Prototype
在子类中定义一个静态的自己,创建自己的时候会调用私有的构造函数,在构造函数中将自己也就是原型加到原来的框架中也就是通过addPrototype(this)将原型放到prototypes[10]中。框架端有了原型后,框架端就可以通过这个原型调用clone函数制造出副本来(当然子类的其他函数,只要原型被添加到框架中,框架端就可以通过这个原型调用。)
总之对于设计模式而言就是拿这三种类与类的关系进行组合,最常用的组合就是委托和继承。