`
xitong
  • 浏览: 6204550 次
文章分类
社区版块
存档分类
最新评论

设计模式之装饰模式学习

 
阅读更多

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

Component定义了一个对象的接口,可以给这些对象动态的添加职责。ConcreteComponent定义了一个具体的对象。也可以给这个对象增加职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component的功能。但对于Component来说是无需知道Decorator的存在的。ConcreteComponent是具体的装饰对象。起到给Component增加功能的作用。


#include<iostream>
using namespace std;


class Component 
{
public:
	virtual void Operation()=0;

};
class ConcreteComponent:public Component
{
public:
	virtual void Operation()
	{
		std::cout<<"具体的抽象对象!"<<std::endl;
	}

};
class Decorator:public Component
{
public:
	Decorator()
	{
		component=NULL;

	}
	void setComponent(Component *c)
	{
		component=c;
	}
	virtual void Operation()
	{
		if(component)
		{
			component->Operation(); 	
		}
	}
protected:
	Component *component;

};

class ConcreteDecoratorA:public Decorator
{
public:
	ConcreteDecoratorA()
		:Decorator()
	{

	}
	virtual void Operation()
	{
		if(component)
		{
			component->Operation();
			show();   	
		}
	}
	void show()
	{
		std::cout<<"I am the unique function of ConcreteDecoratorA"<<std::endl; 
	}
}; 
class ConcreteDecoratorB:public Decorator
{
public:
	ConcreteDecoratorB()
		:Decorator()
	{

	}
	virtual void Operation()
	{
		if(component)
		{
			component->Operation();
			show();   	
		}
	}
	void show()
	{
		std::cout<<"I am the unique function of ConcreteDecoratorB"<<std::endl; 
	}
}; 
int main(int argc,char**argv)
{
	ConcreteComponent *cc=new ConcreteComponent;
	ConcreteDecoratorA *cda=new ConcreteDecoratorA;
	ConcreteDecoratorB *cdb=new ConcreteDecoratorB;

	cda->setComponent(cc);
	cdb->setComponent(cda);//Decorator要派生自Component否则就无法执行此操作。 

	cdb->Operation();

	return 0;
}


装饰模式利用setComponent对对象进行包装,这样每个装饰对象的实现就和如何使用这个对象分离,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链中。

装饰模式是为已有对象动态添加功能的一种方式。在系统需要新功能的时候,我们可以通过向旧类中添加代码实现目的。这些新增加的代码通常装饰了原有类的核心职责或主要行为。向主类增加代码后,会增加主类的复杂度,而这些新增加的代码仅仅是为了满足某些特殊的情况下才会执行的行为的需要。而装饰模式却提供了一个非常好的方案。它把每个要装饰的类放在单独的类中。并让这些类包装它所装饰的对象。当需要执行特殊行为时,客户就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象。

装饰功能的优点:把装饰功能从类中搬移,这可以降低原有类的复杂度。有效地把类的核心功能与装饰功能分开,同时还可以去除相关类的重复装饰逻辑
以下为《大话设计模式》第六章衣服搭配例子的C++版本代码:
#include<iostream>
#include<string>
using namespace std;
class Person//ConcreteComponent类
{
public:
	string name;
public:
	Person()
	{

	}
	Person(string name)
	{
		this->name=name;
	}
	virtual void show()
	{
		std::cout<<"装饰的"<<name<<std::endl;
	}

};
class Clothes:public Person//Decorator类。
{
public:
	Person *p;
public:
	Clothes()
	{
		p=NULL;
	}
	void decorate(Person*pp)
	{
		p=pp;
	}
	virtual void show()
	{
		if(p)
		{
			p->show();
		}
	}
};
class kuaiku:public Clothes//ConcreteDecorator类。
{
public:
	kuaiku()
	{

	}
	virtual void show()
	{
		
		std::cout<<"垮裤"<<std::endl;
		Clothes::show();//也可以使用p->show();
	}
};
class dakucha:public Clothes//ConcreteDecorator类。
{
public:
	dakucha()
	{

	}
	virtual void show()
	{
		
		std::cout<<"大裤衩"<<std::endl;
		Clothes::show();//也可以使用p->show();
	}
};
class LeatherShoe:public Clothes//ConcreteDecorator类。
{
public:
	LeatherShoe()
	{

	}
	virtual void show()
	{
		
		std::cout<<"皮鞋"<<std::endl;
		Clothes::show();//也可以使用p->show();
	}

};
class Xizhuang:public Clothes//ConcreteDecorator类。
{
public:
	Xizhuang()
	{

	}
	virtual void show()
	{
		
		std::cout<<"西装"<<std::endl;
		Clothes::show();//也可以使用p->show();
	}
};
int main(int argc,char**argv)
{
	Person *p=new Person("ithzhang");
	kuaiku *kk=new kuaiku();
	dakucha *dkc=new dakucha();
	LeatherShoe*ls=new LeatherShoe();
	
	kk->decorate(p);
	dkc->decorate(kk);
	ls->decorate(dkc);
	ls->show();
	return 0;
}

分享到:
评论

相关推荐

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式C++学习之装饰模式(Decorator)

    设计模式C++学习之装饰模式(Decorator)

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    HeadFirst 设计模式学习笔记3--装饰模式 Demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5582561.aspx

    设计模式之装饰模式

    设计模式之装饰模式实例,你值得拥有,好好学习,天天向上

    java设计模式学习文档.pdf

    培养学生掌握简单工厂模式、工厂方法模式、单例模式、原型模式、桥接模式、适配器模式、装饰模式、代理模式、命令模式、观察者模式等常用设计模式的设计思想,并掌握在实际软件工程领域中的运用,能够把所学的原理...

    尚硅谷设计模式源码笔记课件.zip

    2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...

    研磨设计模式(完整带书签).part2.pdf

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    常用设计模式学习脑图

    常用设计模式脑图,脑图中根据每个设计模式进行了详细的备注解释!我们的最强大脑在哪里?在这里!(单例模式、原型模式、工厂模式、代理模式、策略模式、适配器模式、委派模式、装饰器模式、观察者模式)

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    本书适用于学习面向中对象设计和设计模式的学生、程序员以及从事软件开发的人士。 本书要点包括: 对象、封装和继承的新观点。 设计模式的思想、起源及其在软件设计学科中的应用。 模式基础以及使用统一建模语言...

    设计模式装饰模式PPT学习教案.pptx

    设计模式装饰模式PPT学习教案.pptx

    设计模式 GOF 23

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    设计模式--C++

    1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

    java后端开发+java23种设计模式学习demo

    设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    JAVA设计模式学习12——装饰器模式

    NULL 博文链接:https://alaric.iteye.com/blog/1911949

    设计模式课程设计

    这是我自己写的一个设计模式的课程设计,拿出来和大家分享一下吧,这是一个用Java语言编写的绘图工具,里面用到了单例模式,桥接模式,建造者模式,命令模式,策略模式以及装饰模式,实现的功能有对三角形矩形圆形的...

    Java常用设计模式例子

    以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...

    设计模式(.PDF)

    1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

Global site tag (gtag.js) - Google Analytics