设计模式之装饰者模式
来源:互联网 发布:淘宝上买的车衣不耐用 编辑:程序博客网 时间:2024/04/26 23:32
设计模式之装饰者模式
装饰者模式动态地将责任附加到对象上,运用对象组合在运行时进行装饰。装饰者模式提供了比继承更加灵活的扩展功能方案。
装饰者模式体现了开放-关闭原则,即类对扩展开放,对修改关闭。其类图如下:
装饰者模式的特点:
1. 装饰者和被装饰者拥有相同的超类型(可能是抽象类也可能是接口)
2. 可以用多个装饰类来包装一个对象,装饰类可以包装装饰类或被装饰对象
3. 因为装饰者和被装饰者拥有相同的抽象类型,因此在任何需要原始对象(被包装)的场合,都可以用装饰过的对象来替代它。
4. 装饰者可以在被装饰者的行为之前或之后,加上自己的附加行为,以达到特殊目的
5. 因为对象可以在任何的时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象
装饰者模式的使用场景:
如果需要添加新功能,但又不想修改定义好的接口或者抽象类,那么这时候就比较适合装饰模式,例如很多图形系统中的组件,就可以使用装饰模式,来让新的组件在继承现在功能的基础上添加新的功能。装饰模式一般是针对接口或者抽象类的变化,如果是具体实现类的变化,则要考虑适用哪种模式。
优点:
1.可以不用修改原有的接口,就可以实现新功能的添加。
2.装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同ConcreteComponent实现不同的功能。
缺点:
1.复杂性增加,装饰者模式会导致许多小类的产生。
以手机为例说明装饰者模式:
1、创建一个phone超类:
class phone
{
public:
phone(){}
virtual ~phone(){}
virtual int cost()=0;
virtual void showcost()=0;
};
2、创建两种具体的手机:iphone和hwphone
#include "phone.h"
#include <string>
class iphone: public phone
{
private:
string m_name;
public:
iphone(string name):m_name(name){}
virtual ~iphone(){}
int cost()
{
return6999;
}
void showcost()
{
cout<<m_name<<"cost:"<<cost()<<endl;
}
};
class hwphone: public phone
{
private:
string m_name;
public:
hwphone(string name):m_name(name){}
virtual ~hwphone(){}
int cost()
{
return3999;
}
void showcost()
{
cout<<m_name<<"cost:"<<cost()<<endl;
}
};
3、创建装饰者接口类:
#include "phone.h"
class Decorator: public phone
{
public:
Decorator(){}
virtual~Decorator(){}
virtual int cost()=0;
virtual void showcost()=0;
};
4、创建两种装饰对象:贴膜和手机套:
#include "decorator.h"
#include <iostream>
using namespace std;
class ScreenProtector: publicDecorator
{
private:
phone* m_phone;
public:
ScreenProtector(phone* pphone): m_phone(pphone){}
~ScreenProtector(){}
int cost()
{
return20 + m_phone->cost();
}
void showcost()
{
m_phone->showcost();
cout<<"ScreenProtector + phone cost:"<<cost()<<endl;
}
};
class PhoneCover: public Decorator
{
private:
phone* m_phone;
public:
PhoneCover(phone* pphone):m_phone(pphone){}
~PhoneCover(){}
int cost()
{
return5 + m_phone->cost();
}
void showcost()
{
m_phone->showcost();
cout<<"PhoneCover + phone cost:"<<cost()<<endl;
}
};
5、随意地为自己的手机增加装饰吧
#include "concretedecorator.h"
#include "concretephone.h"
int main()
{
iphone Myihone("Ihone4");// Iphone手机
hwphone Myhwphone("P10");// hwphone手机
ScreenProtectorMyScreenProtectorPhone(&Myihone); //Iphone手机贴膜
MyScreenProtectorPhone.showcost();
PhoneCoverMyPhoneCover(&MyScreenProtectorPhone);//再给手机增加一个手机套
MyPhoneCover.showcost();
PhoneCoverMyHwPhoneCover(&Myhwphone);// HW手机加个手机套
MyHwPhoneCover.showcost();
ScreenProtectorMyHwPhoneSreenProtector(&MyHwPhoneCover); // HW手机贴膜
MyHwPhoneSreenProtector.showcost();
return 0;
}
- 设计模式之装饰者设计模式
- 设计模式 之 装饰者
- 设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之Decorator(装饰者模式)
- 设计模式之五---装饰者模式
- 设计模式之---装饰者模式
- c++设计模式之装饰者模式
- Php设计模式之装饰者模式
- java设计模式之装饰者模式
- 设计模式之装饰者模式
- 【设计模式】之装饰者模式
- HeadFirst设计模式之装饰者模式
- c++设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之--装饰者模式
- 设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之观察者模式
- 【机器学习】神经网络及BP推导
- HDU
- PAT乙级题1020.月饼
- poj 1236 Network of Schools 强连通
- 设计模式之装饰者模式
- 正则
- jdk环境变量配置
- selenium常用方法——基于Python
- 169. Majority Element (数组)
- request对象
- 函数探幽(1) --引用(1)
- Rhyme/Linux 输出重定向
- 吐槽,我是菜无敌