设计模式——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

原文地址:https://www.cnblogs.com/sylvan/p/9307502.html