_007_装饰器模式

======================================


一 装饰器模式


1 装饰器模式概念

如果可以通过一个已经存在的类,额外添加一个功能,生成一个新的类

这种类就是一个装饰器,


2 装饰器模式代码

#include <iostream>
using namespace std;

//创建一个抽象的手机类
class Phone
{
public:
	virtual void show() = 0;
};

//创建一个具体的手机继承并实现抽象的手机类
class Mi :public Phone
{
public:
	void show()
	{
		cout << "秀出了小米手机" << endl;
	}
};

//如果要给小米手机添加一个膜,那么我们可以修改Mi类,定义贴膜函数,但是不符合开闭原则
//所以可以用装饰器模式

//创建一个装饰器类同样继承Phone,让装饰器类和具体手机类有同一个父类
//但是这个装饰如同一个代理,并不是实现功能,因为可能不止要添加一个功能
//所以应该继续抽象出show方法

class Decorate :public Phone
{
public:
	Decorate(Phone *myphone) :myphone(myphone){}
	virtual void show() = 0;
protected:
	Phone *myphone;
};

//创建一个贴膜功能类,去继承并实现装饰器类,这个功能类的父类便是装饰器类
class 贴膜 :public Decorate
{
public:

	//去初始化父类的保护成员,主要由父类去调用show
	贴膜(Phone *phone) :Decorate(phone){}
	
	//去实现父类的方法,并且通过父类的保护成员调用实现方法
	//然后调用自己的方法
	virtual void show()
	{
		this->myphone->show();
		this->贴(); //自己的方法
	}

	void 贴()
	{
		cout << "已贴膜" << endl;
	}

};

class 手机套 :public Decorate
{
public:
	手机套(Phone *myphone) :Decorate(myphone){}
	void show()
	{
		this->myphone->show();
		this->phone_shell();
	}

	void phone_shell()
	{
		cout << "手机套" << endl;
	}
};



int main()
{
	Phone *p1 = new Mi;
	Phone *p2 = new 贴膜(p1);
	p2->show();
	cout << "==================" << endl;
	Phone *p3 = new 手机套(p2);
	p3->show();
}


3 代理模式和装饰器模式的区别

(1) 代理模式是指自己能做到, 但是让别人去做,别人能做的更多

相当于加了一层壳

(2) 装饰器模式指的是一个原有的功能上添加功能,相当于加了很多

装饰的功能

扫描二维码关注公众号,回复: 1523095 查看本文章

(3)从代码层来看,代理模式是在代理类里实现功能,而装饰器模式

则比代理模式多抽象了一层.







猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/80593116
今日推荐