一、什麼是裝飾模式
還記得我的一個長輩曾經買了一部手機,買的時候還好好的新新的,剛拿到家就壞了,怎麼回事呢?其實就是一個假手機,把一個已經報廢的舊機子改了改,外面加了個新殼子罷了,這就是一個裝飾模式,在原有的基礎上加了些東西。
裝飾模式(Decorator),動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。裝飾器模式屬於結構型模式。
答:裝飾器模式是指動態地給一個對象增加一些額外的功能,同時又不改變其結構。
優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類 的功能。
裝飾器模式的關鍵:裝飾器中使用了被裝飾的對象。
比如,創建一個對象“laowang”,給對象添加不同的裝飾,穿上夾克、戴上帽子......,這個執行過程就是裝飾者模式,
UML結構圖如下:
其中,Component是抽象構件,定義一個對象接口,可以給這些對象動態地添加職責;ConreteComponent定義一個具體對象,也可以給這個對象添加一些職責;Decorator是裝飾抽象類,實現接口或抽象方法;ConreteDecorator是具體裝飾對象,起到給Component添加職責的功能。
#include <iostream>
using namespace std;
class Car{
public:
virtual void show()=0;
};
class Runcar : public Car{
public:
virtual void show(){
cout<<"car can run"<<endl;
}
};
class swimcar : public Car{
public:
swimcar(Car* p){
m_p=p;
}
void swim(){
cout<<"can swim"<<endl;
}
virtual void show(){
m_p->show();
swim();
}
private:
Car* m_p;
};
class flycar : public Car{
public:
flycar(Car *p){
m_p=p;
}
void fly(){
cout<<"car can fly";
}
virtual void show(){
m_p->show();
fly();
}
private:
Car * m_p;
};
int main()
{
Runcar* runcar=new Runcar;
//runcar->show();
swimcar *sw=new swimcar(runcar);
//sw->show();
// delete sw;
flycar *fly=new flycar(sw);
fly->show();
delete fly;
delete sw;
sw=NULL;
fly=NULL;
return 0;
}