编程学习之装饰者模式
2016-04-06 22:15
323 查看
装饰模式:实现动态的给一个对象添加一些额外的职责。优越性主要体现在减少对了主类的更改,遵守了开放封闭原则。将类的核心职责和装饰功能分离了开来。
在这个设计模式之中,主要分为这几个模块:具体的被装饰对象,装饰功能的接口,具体的装饰功能。
首先将被装饰对象的接口全部提取出来,分别让含有具体装饰功能的类和被装饰对象的类继承于该类,这样具体的装饰功能类便具有了被装饰对象的方法接口。
每个装饰功能类之中含有具体对象类的指针。(c#中是引用,但引用实质上仍与指针有类似意义)
当需要对现有的对象类的部分功能进行更改的时候,特别是这种更改仅仅是暂时的动态的改变的时候,就完全可以通过将具体对象类的地址值赋值给装饰功能类的对象,而具体的装饰功能类则对需要改变的地方进行重写,无改变的地方则直接调用原来的方法即可。而且不会改变原来的代码。
这是我所定义的接口类,其中只有一些虚的方法。
看下面:
再看具体化的装饰功能类:
主逻辑代码如下:
以上代码是我所写的一个具体的设计模式样例的代码的一部分,后面我会将整个工程代码发出来,提供给大家:
http://pan.baidu.com/s/1i4DsURr
在这个设计模式之中,主要分为这几个模块:具体的被装饰对象,装饰功能的接口,具体的装饰功能。
首先将被装饰对象的接口全部提取出来,分别让含有具体装饰功能的类和被装饰对象的类继承于该类,这样具体的装饰功能类便具有了被装饰对象的方法接口。
每个装饰功能类之中含有具体对象类的指针。(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