zoukankan      html  css  js  c++  java
  • 设计模式之装饰模式(Decorator)

    装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口

    作用

    装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类就能扩展对象的新功能,提供了比继承更有弹性的替代方案,避免了子类数量膨胀带来的系统臃肿。

    类视图

    代码实现

    class Component
    {
    public:
    	Component(){}
    	virtual ~Component(){}
    
    	virtual void operation() = 0;
    };
    
    
    class ConcreteComponentA : public Component
    {
    public:
    	ConcreteComponentA(){}
    	~ConcreteComponentA(){}
    
    	void operation()
    	{
    		fprintf(stderr, "ConcreteComponentA's operation!
    ");
    	}
    };
    
    class ConcreteComponentB : public Component
    {
    public:
    	ConcreteComponentB(){}
    	~ConcreteComponentB(){}
    
    	void operation()
    	{
    		fprintf(stderr, "ConcreteComponentB's operation!
    ");
    	}
    };
    
    class Decorator : public Component
    {
    public:
    	Decorator() :mComponent(NULL){}
    	virtual ~Decorator(){}
    
    	virtual void operation()
    	{
    		if (mComponent)
    			mComponent->operation();
    	}
    	virtual void setComponent(Component* pComponent)
    	{
    		mComponent = pComponent;
    	}
    
    protected:
    	Component* mComponent;
    };
    
    
    class ConcreteDecoratorE : public Decorator
    {
    public:
    	ConcreteDecoratorE ();
    	virtual ~ConcreteDecoratorE ();
    
    	virtual void addBehavior()
    	{
    		mComponent->operation();
    		fprintf(stderr, "ConcreteDecoratorE's addBehavior!
    ");
    	}
    };
    
    class ConcreteDecoratorF : public Decorator
    {
    public:
    	ConcreteDecoratorF ();
    	virtual ~ConcreteDecoratorF ();
    
    	virtual void addBehavior()
    	{
    		operation();
    		fprintf(stderr, "ConcreteDecoratorF's addBehavior!
    ");
    	}
    };
    
    
    
    int main()
    {
    	ConcreteComponentB *pComponent = new ConcreteComponentB();
    	ConcreteDecoratorF decorator;
    	decorator.setComponent(pComponent);
    	decorator.addBehavior();
    }
    
  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/chencarl/p/8649394.html
Copyright © 2011-2022 走看看