太原优化型网站建设网络科技公司取名
news/
2025/9/28 10:18:24/
文章来源:
太原优化型网站建设,网络科技公司取名,建设商务网站公司,大连建设网节能办公室网站Decorator
动机
在某些情况下我们可能会“过度地使用继承来扩展对象的功能”#xff0c; 由于继承为类型引入的静态特质#xff0c;使得这种扩展方式缺乏灵活性#xff1b; 并且随着子类的增多#xff08;扩展功能的增多#xff09;#xff0c;各种子类的组合#xff…Decorator
动机
在某些情况下我们可能会“过度地使用继承来扩展对象的功能” 由于继承为类型引入的静态特质使得这种扩展方式缺乏灵活性 并且随着子类的增多扩展功能的增多各种子类的组合扩展 功能的组合会导致更多子类的膨胀如何使”对象功能的扩展“能够根据需要动态实现同时避免”扩展功能的增多“带来的子类膨胀问题从而使得任何”功能扩展变化“所导致的影响降到最低
模式定义 动态组合地给一个对象增加一些额外的职责。就增加功能而言Decorator模式比生成子类继承更为灵活消除重复代码 减少子类个数。 #include iostreamclass Component
{
public:virtual ~Component() {}virtual void operation() 0;// ...
};class ConcreteComponent : public Component
{
public:~ConcreteComponent() {}void operation(){std::cout Concrete Component operation std::endl;}// ...
};class Decorator : public Component // is-a 为了完善接口规范
{
private:Component *component; // has-a 为了将来具体的实现public:~Decorator() {}Decorator(Component *c) : component(c) {}virtual void operation(){component-operation();}// ...
};class ConcreteDecoratorA : public Decorator
{
public:ConcreteDecoratorA(Component *c) : Decorator(c) {}void operation(){Decorator::operation();std::cout Decorator A std::endl;}// ...
};class ConcreteDecoratorB : public Decorator
{
public:ConcreteDecoratorB(Component *c) : Decorator(c) {}void operation(){Decorator::operation();std::cout Decorator B std::endl;}// ...
};int main()
{ConcreteComponent *cc new ConcreteComponent();ConcreteDecoratorB *db new ConcreteDecoratorB(cc);ConcreteDecoratorA *da new ConcreteDecoratorA(db);Component *component da;component-operation(); delete da;delete db;delete cc;return 0;
}
/*
Concrete Component operation
Decorator B
Decorator A
*/何时场景
动态且透明地向各个对象添加职责即不影响其他对象对于可以撤销的责任当通过子类化扩展不切实际时
总结
通过采用组合而非继承的手法 Decorator模式实现了在运行时动态扩展对象功能的能力而且可以根据需要扩展多个功能。避免 了使用继承带来的“灵活性差”和“多子类衍生问题Decorator类在接口上表现为is-a Component的继承关系即Decorator类继承了Component类所具有的接口为了完善接口规范。但在实现上又表现为has-a Component的组合关系即Decorator类又使用了另外一个Component类为了将来的具体实现Decorator模式的目的并非解决“多子类衍生的多继承”问题 Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920488.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!