装饰者模式
说真的,写了4年多的C++,因为都是通讯协议栈和服务器,业务比较少,类用的比较少,而且之间的关系都是简单的关联,依赖,聚合,所以很不理解装饰者,其实是还没有真的理解OOP吧,这也是一直没有信心担任PL的原因,都是用C++来写C,每个功能都是一个Function(). 而好不容易有一个业务多一些的项目,缺因为加入的晚,几乎是在现有框架下派生子类,加代码。
装饰者模式(Decorator Pattern),是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
代码是抄别人的,暂时这样吧。总算是表面上理解了。
class Phone
{public:
Phone()
{
}
virtual ~Phone()
{
}
virtual void ShowDecorate() {}
public:
string m_strName;
};
//具体的手机类
class NokiaPhone : public Phone
{
public:
NokiaPhone(string strName, int iValue) : m_name(strName), m_iValue(iValue)
{
}
~NokiaPhone()
{
}
private:
string m_name;
public:
int m_iValue;
void ShowDecorate()
{
cout<<m_name<<"的装饰"<<endl;
}
};
class DecoratorPhone : public Phone
{
public:
DecoratorPhone(Phone *pPhone) : m_pPhone(pPhone)
{
}
private:
Phone *m_pPhone;
public:
void ShowDecorate()
{
m_pPhone->ShowDecorate();
}
};
class DecoratorPhoneA : public DecoratorPhone
{
public:
DecoratorPhoneA(Phone *pPhone) : DecoratorPhone(pPhone)
{
}
virtual void ShowDecorate()
{
DecoratorPhone::ShowDecorate();
AddDecorate();
}
private:
void AddDecorate()
{
cout<<"屏幕贴膜"<<endl;
} //增加的装饰
};
class DecoratorPhoneB : public DecoratorPhone
{
public:
DecoratorPhoneB(Phone *pPhone) : DecoratorPhone(pPhone)
{
}
virtual void ShowDecorate()
{
DecoratorPhone::ShowDecorate();
AddDecorate();
}
private:
void AddDecorate()
{
cout<<"添加卡通手机外壳"<<endl;
} //增加的装饰
};
int main()
{
Phone *pPhone = new NokiaPhone("6800", 2000);
DecoratorPhoneA *pDecPhoneA = new DecoratorPhoneA(pPhone);
DecoratorPhoneB *pDecPhoneB = new DecoratorPhoneB(pDecPhoneA);
pDecPhoneB->ShowDecorate();
char c;
cin >> c;
return 0;
}