zoukankan      html  css  js  c++  java
  • 设计模式——4.装饰模式

    装饰模式(Decorator)

    装饰模式(Decorator)简介:

    动态的为一个对象增加额外的职责,为对象增加功能时,使用装饰模式比单纯的子类继承要更加的灵活。

    装饰模式结构:

    Decorator

    C++代码

    BaseClass对象抽象基类以及ConcreteClass具体对象实现类:

    //file: BaseClass.h
    #pragma once
    class BaseClass
    {
    public:
    	BaseClass();
    	virtual ~BaseClass();
    
    	virtual void operation();
    };
    
    class ConcreteClass : public BaseClass
    {
    public:
    	ConcreteClass();
    	virtual ~ConcreteClass();
    
    	void operation();
    };
    
    //file: BaseClass.cpp
    #include "pch.h"
    #include "BaseClass.h"
    #include <iostream>
    
    //BaseClass
    BaseClass::BaseClass() {}
    
    BaseClass::~BaseClass() {}
    
    void BaseClass::operation() {}
    
    //ConcreteClass
    ConcreteClass::ConcreteClass() {}
    
    ConcreteClass::~ConcreteClass() {}
    
    void ConcreteClass::operation()
    {
    	std::cout << "ConcreteComponent's normal operation!" << std::endl;
    }
    

    Decorator装饰抽象类以及ConcreteDecoratorA/B具体装饰是实现类:

    //file: Decorator.h
    #pragma once
    #include "BaseClass.h"
    
    class Decorator : public BaseClass
    {
    public:
    	Decorator(BaseClass *pcom);
    	virtual ~Decorator();
    	
    	void operation();
    
    private:
    	BaseClass *m_BaseClass;
    };
    
    class ConcreteDecoratorA : public Decorator
    {
    public:
    	ConcreteDecoratorA(BaseClass *pcom);
    	virtual ~ConcreteDecoratorA();
    
    	virtual void operation();
    	void addBehavior();
    };
    
    class ConcreteDecoratorB : public Decorator
    {
    public:
    	ConcreteDecoratorB(BaseClass *pcom);
    	virtual ~ConcreteDecoratorB();
    
    	virtual void operation();
    	void addBehavior();
    };
    
    //file: Decorator.cpp
    #include "pch.h"
    #include "Decorator.h"
    #include <iostream>
    
    //Decorator
    Decorator::Decorator(BaseClass *pcom) : m_BaseClass(pcom) {}
    
    Decorator::~Decorator() {}
    
    void Decorator::operation()
    {
    	m_BaseClass->operation();
    }
    
    //ConcreteDecoratorA
    ConcreteDecoratorA::ConcreteDecoratorA(BaseClass *pcom) : Decorator(pcom) {}
    
    ConcreteDecoratorA::~ConcreteDecoratorA() {}
    
    void ConcreteDecoratorA::addBehavior()
    {
    	std::cout << "AddBehavior AAAA" << std::endl;
    }
    
    void ConcreteDecoratorA::operation()
    {
    	Decorator::operation();
    	addBehavior();
    }
    
    //ConcreteDecoratorB
    ConcreteDecoratorB::ConcreteDecoratorB(BaseClass *pcom) : Decorator(pcom) {}
    
    ConcreteDecoratorB::~ConcreteDecoratorB() {}
    
    void ConcreteDecoratorB::addBehavior()
    {
    	std::cout << "AddBehavior BBBB" << std::endl;
    }
    
    void ConcreteDecoratorB::operation()
    {
    	Decorator::operation();
    	addBehavior();
    }
    

    客户端代码:

    //file: DecoratorPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    #include "pch.h"
    #include "Decorator.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	ConcreteClass *p = new ConcreteClass();
    
    	BaseClass *pa = new ConcreteDecoratorA(p);
    	pa->operation();
    
    	BaseClass *pb = new ConcreteDecoratorB(pa);
    	pb->operation();
    
    	delete p;
    	delete pa;
    	delete pb;
    	return 0;
    }
    

    C#代码

    BaseClass对象抽象基类以及ConcreteClass具体对象实现类:

    public abstract class BaseClass
    {
    	public abstract void Operation();
    }
    
    public class ConcreteClass : BaseClass
    {
    	public override void Operation()
    	{
    		Console.WriteLine("Concrete Base Operation .");
    	}
    }
    

    Decorator装饰抽象类以及ConcreteDecoratorA/B具体装饰是实现类:

    public abstract class Decorator : BaseClass
    {
    	protected BaseClass m_BaseClass;
    
    	public Decorator(BaseClass baseClass)
    	{
    		m_BaseClass = baseClass;
    	}
    
    	public override void Operation()
    	{
    		if (m_BaseClass != null)
    			m_BaseClass.Operation();
    	}
    }
    
    public class ConcreteDecoratorA : Decorator
    {
    	public ConcreteDecoratorA(BaseClass baseClass) : base(baseClass)
    	{
    
    	}
    
    	public void AddBehavior()
    	{
    		Console.WriteLine("ConcreteDecoratorA 's Decorator Behavior .");
    	}
    
    	public override void Operation()
    	{
    		base.Operation();
    		AddBehavior();
    	}
    }
    
    public class ConcreteDecoratorB : Decorator
    {
    	public ConcreteDecoratorB(BaseClass baseClass) : base(baseClass)
    	{
    
    	}
    
    	public void AddBehavior()
    	{
    		Console.WriteLine("ConcreteDecoratorB 's Decorator Behavior .");
    	}
    
    	public override void Operation()
    	{
    		base.Operation();
    		AddBehavior();
    	}
    }
    

    客户端代码:

    class Program
    {
    	static void Main(string[] args)
    	{
    
    		ConcreteClass p = new ConcreteClass();
    
    		BaseClass pa = new ConcreteDecoratorA(p);
    		pa.Operation();
    
    		BaseClass pb = new ConcreteDecoratorB(pa);
    		pb.Operation();
    
    		Console.ReadKey(false);
    	}
    }
    

    运行实例:

    DecoratorRes

    REF

    书籍:

    设计模式与游戏开发、大话设计模式

    GitHub:

    https://github.com/me115/design_patterns

  • 相关阅读:
    ArrayList.sort & Collections.sort
    preliminary->advanced exam coding part
    Spring JDBC的使用
    Spring之面向切面编程(AOP)
    Spring静态代理与动态代理
    Spring之JDBC的连接与注解的使用
    Spring入门之Bean的实例化方式
    Mybatis入门(二)
    Mybatis入门(一)
    正则表达式——转载
  • 原文地址:https://www.cnblogs.com/sylvan/p/9307502.html
Copyright © 2011-2022 走看看