装饰模式(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);
}
}
运行实例:
REF
书籍:
设计模式与游戏开发、大话设计模式
GitHub: