编程学习之装饰者模式

装饰模式:实现动态的给一个对象添加一些额外的职责。优越性主要体现在减少对了主类的更改,遵守了开放封闭原则。将类的核心职责和装饰功能分离了开来。

在这个设计模式之中,主要分为这几个模块:具体的被装饰对象,装饰功能的接口,具体的装饰功能。

首先将被装饰对象的接口全部提取出来,分别让含有具体装饰功能的类和被装饰对象的类继承于该类,这样具体的装饰功能类便具有了被装饰对象的方法接口。

每个装饰功能类之中含有具体对象类的指针。(c#中是引用,但引用实质上仍与指针有类似意义)

当需要对现有的对象类的部分功能进行更改的时候,特别是这种更改仅仅是暂时的动态的改变的时候,就完全可以通过将具体对象类的地址值赋值给装饰功能类的对象,而具体的装饰功能类则对需要改变的地方进行重写,无改变的地方则直接调用原来的方法即可。而且不会改变原来的代码。

#pragma once
#include<iostream>
using namespace std;
class Monkey
{
public:
	Monkey();
	~Monkey();
	virtual void Show()=0;
};
#include "Monkey.h"

Monkey::Monkey(){}
Monkey::~Monkey(){}

这是我所定义的接口类,其中只有一些虚的方法。

#pragma once
#include "Monkey.h"
class People :
	public Monkey
{
public:
	People();
	virtual ~People();
	virtual void Show();
};

#include "People.h"

People::People(){}
People::~People(){}

void People::Show()
{
	cout << "高智商的人" << endl;
}

这是将要具体实例化的对象的人的类,在这个人的类之中已经具备了一些具体的功能,现在如果我们需要对这些功能做出一些改变,怎么办呢?

看下面:

#pragma once
#include "Monkey.h"
class ConcreteDecorator :
	public Monkey
{
public:
	ConcreteDecorator();
	virtual ~ConcreteDecorator();
	Monkey* obj;
	virtual void SetComponent(Monkey* obj);
	virtual void Show();
};
#include "ConcreteDecorator.h"

ConcreteDecorator::ConcreteDecorator(){}
ConcreteDecorator::~ConcreteDecorator(){}

void ConcreteDecorator::SetComponent(Monkey* obj) 
{
	this->obj = obj;
}

void ConcreteDecorator::Show()
{
	this->obj->Show();
}
这个是我所创建的一个所有的具体功能的类的基类,通过这个类,我们便可以派生出其他很多具体的功能类,注意在这个类之中拥有一个关于具体对象的指针,通过这个指针我们便可以获取到实例化的具体的对象

再看具体化的装饰功能类:

#pragma once
#include "ConcreteDecorator.h"
class BehaviorCreat :
	public ConcreteDecorator
{
public:
	BehaviorCreat();
	virtual ~BehaviorCreat();
	virtual void Show();
};

#include "BehaviorCreat.h"

BehaviorCreat::BehaviorCreat(){}
BehaviorCreat::~BehaviorCreat(){}

void BehaviorCreat::Show()
{
	cout << "会创造性行为的";
	ConcreteDecorator::Show();
}
这是我所创建的创造性性行为的修饰类,我们可以看到在这个类中我们对对象类之中的行为进行了重写,同时保留了部分原来的方法,且对原类没有任何更改,也没有重复代码的累赘,我们直接使用被修饰的对象就可以完成功能的扩展和改变。

主逻辑代码如下:

// 装饰模式样例.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"People.h"
#include"Orangutans.h"
#include"BehaviorCreat.h"

int main()
{
	People* man = new People();
	Orangutans* xingxing = new Orangutans();
	BehaviorCreat *bh_creat = new BehaviorCreat();
	bh_creat->SetComponent(xingxing);
	bh_creat->Show();
	bh_creat->SetComponent(man);
	bh_creat->Show();
	delete(man);
	delete(xingxing);
	delete(bh_creat);
	system("pause");
    return 0;
}

以上代码是我所写的一个具体的设计模式样例的代码的一部分,后面我会将整个工程代码发出来,提供给大家:

http://pan.baidu.com/s/1i4DsURr

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章