装饰者模式(Decorator)
装饰者模式(Decorator)
装饰者模式(Decorator)[Wrapper]
意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。
应用:给GUI组件添加功能等。
模式结构:
心得:
装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口,这个统一的接口正是被装饰对象需要扩展功能的地方,因此它们需要一个共同的接口(AbstractComponent)。另外为了完成装饰的目的,装饰器需要包含被装饰的对象,装饰器不直接包含被装饰对象,而是包含它们统一接口的引用,这样通过多态机制可以实现多层装饰。注意装饰器对抽象接口的关系是一对一的,这和组合模式很像,但是一对一的关系决定了装饰器一次只能装饰一个对象,这种关系正是我们想要的。装饰器为被装饰对象添加功能通过调用被装饰对象的统一接口实现,如果装饰器需要复杂的扩展,我们通过继承装饰器实现具体的装饰器(ConcreteDecorator),具体的装饰器可以扩展数据(addedState),也可以扩展接口功能(addedBehavior)。
举例:
被装饰的对象假如是一块蛋糕,装饰器就是为蛋糕添加额外的属性,比如加上一朵花等。统一接口为了简单我们输出装饰后蛋糕的名字,那么装饰器的统一接口operation实现时就需要调用被装饰对象的operation,然后添加额外的名字。C++代码实现如下:
{
public:
virtual string operation()=0;
virtual ~AbstractComponent(){}
};
class ConcreteComponent:public AbstractComponent
{
public:
virtual string operation()
{
return "基本对象";
}
};
class Decorator:public AbstractComponent
{
protected:
AbstractComponent*pAbsComponent;
public:
Decorator(AbstractComponent*pac):pAbsComponent(pac){}
virtual~Decorator()
{
delete pAbsComponent;
}
};
class ConcreteDecorator:public Decorator
{
public:
ConcreteDecorator(AbstractComponent*pac):Decorator(pac){}
virtual string operation()
{
string str="装饰后的";
str+=pAbsComponent->operation();
return str;
}
};
用户使用起来代码如下:
new ConcreteDecorator(
new ConcreteDecorator(
new ConcreteComponent()
));
cout<<pac->operation().c_str()<<endl;
delete pac;
从使用装饰者模式的代码来看,装饰器对对象的操作就像包装一样,一层层的为对象扩展功能,而且装饰器装饰后的对象仍然可以被装饰。
若本文对你有所帮助,您的 关注 和 推荐 是我分享知识的动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)