设计模式:装饰器模式、外观模式、适配器模式


前言

装饰器模式、外观模式、适配器模式举例


一、装饰器模式

例子:手机类,可以有多个,这里举例小米手机
初始化只有小米裸机,使用装饰器进行贴膜操作,加皮套操作。

class Phone{
public:
	virtual void show() = 0;
};
class MiPhone :public Phone{
public:
	virtual void show(){
		cout << "小米手机" << endl;
	}
};
class Decorator :public Phone{
public:
	Decorator(Phone* p) :phone(p){}
	virtual void show() = 0;
protected:
	Phone* phone;
};
class moDecorator :public Decorator{
public:
	moDecorator(Phone* p) :Decorator(p){}
	void show(){
		phone->show();
		mo();
	}
	void mo(){
		cout << "贴膜" << endl;
	}
};
class taoDecorator :public Decorator{
public:
	taoDecorator(Phone* p) :Decorator(p){}
	void show(){
		phone->show();
		tao();
	}
	void tao(){
		cout << "带皮套" << endl;
	}
};

int main()
{
	Phone* p = new MiPhone;
	p->show();
	cout << "-------" << endl;
	Phone* moPhone = new moDecorator(p);
	moPhone->show();
	cout << "---------" << endl;
	Phone* taoPhone = new taoDecorator(p);
	taoPhone->show();
	cout << "---------" << endl;
	Phone* moAndTaoPhone = new moDecorator(taoPhone);
	moAndTaoPhone->show();
	return 0;
}

二、外观模式

例子:有dvd,灯,游戏盒子
游戏模式:dvd打开,灯关闭,游戏盒子打开
其他模式:dvd关闭,灯打开,游戏盒子打开

class DVD{
public:
	void on(){ 	cout << "dvd打开了" << endl;	}
	void off(){	cout << "dvd关闭了" << endl;	}	
};
class Light{
public:
	void on(){ 	cout << "Light打开了" << endl;	}
	void off(){	cout << "Light关闭了" << endl;	}	
};
class XBox{
public:
	void on(){ 	cout << "XBox打开了" << endl;	}
	void off(){	cout << "XBox关闭了" << endl;	}	
};

class Mode{
public:
	void GameMode(){
		dvd->on();	light->off();	xBox->on();
	}
	void otherMode(){
		dvd->off(); light->on();	xBox->on();
	}
private:
	DVD* dvd;
	Light* light;
	XBox* xBox;
};
int main()
{
	Mode* m = new Mode;
	m->GameMode();
	cout << " ----" << endl;
	m->otherMode();
	return 0;
}

三、适配器模式

例子:对手机充电使用5V,但现在只有220V,使用适配器使其兼容。

class V5{
public:
	virtual void useV5() = 0;
};
class V220{
public:
	void useV220(){
		cout << "使用220V充电" << endl;
	}
};
class Adapter:public V5{
public:
	Adapter(V220* v):v220(v){}
	void useV5(){
		v220->useV220();
	}
private:
	V220* v220;
};

class Phone{
public:
	Phone(V5* v):v5(v){}
	void charge(){
		cout << "phone充电" << endl;
		v5->useV5();
	}
private:
	V5* v5;
};

int main()
{
	V5* v5 = new Adapter(new V220);
	Phone* p = new Phone(v5);
	p->charge();
	return 0;
}

总结

个人理解:

  1. 装饰器模式对类装饰,修改属性,比如可以对小米裸机贴膜或者取膜。
  2. 外观模式将多个不同类的功能结合在一起。
  3. 适配器模式将不对应的类通过适配器类使其兼容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值