第三周介绍了继承多态,然后利用一些设计方法说明了封装。一来考虑到后续的课程《设计模式》,二来此时的理解还很粗糙,暂且压下。需要补充的要点:1.复合于委托;2.原型设计;3.Method template
1.关于委托#
委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能
从某种意义上来说,它和继承相似,都可以使用其他的类的功能。不过不同的,继承往往必须在逻辑上存在固定的关系,不如委托灵活。
委托是一种模式,委托者不完成实际的工作,也不关心完成工作的细节,但有完成工作的接口,这个接口只是将请求发给被委托者来完成。下面用一个最基本的例子来说明这个问题:
Demo_01
//MyString 是委托类,String是被委托类
class MyString
{
public:
MyString();
~MyString();
void MyInsert(char ch,int pos);
public:
void MyUniqFun(void);
private:
String *m_pstr;
};
MyString::MyString()
{
m_pstr=new String;
}
MyString::~MyString()
{
delete m_pstr;
}
void MyString::MyInsert(char ch,int pos)
{
m_pstr->insert(ch,pos); //委托,把插入功能委托给String实现,MyString只提供接口
}
void MyUniqFun(void)
{
//此处可自由发挥,实现该类的独特功能
}
2.关于原型
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
创建一个原型的虚基类,声明一个拷贝自身的接口,然后根据子类的具体原型类,利用拷贝构造函数实现自身的拷贝操作。
下面是源于《大话设计模式》书中一份代码说明:
Demo_02
#include <cstdio>
//接口
class CPrototype
{
public:
CPrototype(){}
virtual ~CPrototype(){}
virtual CPrototype* Clone() = 0;
};
//实现
class CConcretePrototype : public CPrototype
{
public:
CConcretePrototype():m_counter(0){}
virtual ~CConcretePrototype(){}
//拷贝构造函数
CConcretePrototype(const CConcretePrototype& rhs)
{
m_counter = rhs.m_counter;
}
//复制自身
virtual CPrototype* Clone()
{
//调用拷贝构造函数
return new CConcretePrototype(*this);
}
private:
int m_counter;
};
int main(int argc, char **argv)
{
//生成对像
CPrototype* conProA = new CConcretePrototype();
//复制自身
CPrototype* conProB = conProA->Clone();
delete conProA; conProA=NULL;
delete conProB; conProB=NULL;
return 0;
}