桥接模式升级装饰模式的过程

设计模式目录
桥接模式-坦克大战-c#
桥接模式-坦克大战-js

桥接模式
几种模式的对比分析
目的:某个机能有两个维度的变化,那么把这个机能分别交给两个对象对负责,让他俩组合来完成任务。
这样当构建丰富多彩的机能时,只需要更小的复杂度就能实现。
记录:这个模式其实本身是面向对象编程的基础,任何两个对象都可以发生桥接,那是不是发生了桥接就叫桥接模式呢。理论上这么说应该也没有问题,但桥接这么模式强调的时桥接后形成组合功能的丰富。
https://download.youkuaiyun.com/download/xie__jin__cheng/10962753(这是桥接模式的源码)
桥接模式没有什么特别说明的,就是多态的一个简单应用。
因为默认设置成了5分下载的条件,所以将代码和部分说明粘贴如下:
需求:
在这里插入图片描述上图是根据该需求进行的简单继承的方式实现的设计,
下图是采用桥接模式的设计(并对两种方式做了对比说明)

需求变更说说桥接和原型。
刚才看原型模式的时候,原型模式在应对变化的时候,也和桥接的思想一样,用的是组合的思想。
这和这里的桥接思想是一样的,桥接本质上就是一种组合。
这里对需求的变化,附近机能的变化,最终采取了桥接的方式,来应对变化。
这都是用的设计模式中的组合聚合原则。

代码:

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////////////////////
// ---------------------------------抽象层------------------------------
//////////////////////////////////////////////////////////////////////////
//坦克类
class Tank
{
public:
	virtual void Shot(){}
};
//装饰类
class Decorator
{
private:
	Tank& tank;
public:
	Decorator(Tank& tank_object):tank(tank_object){}
	virtual void Shot()
	{
		tank.Shot();
	}
};

//////////////////////////////////////////////////////////////////////////
// ------------------------------实施层----------------------------------
//////////////////////////////////////////////////////////////////////////

//Tank---------------------------------------------------------------
//70坦克实现
class TankB70: public Tank
{
public:
	virtual void Shot()
	{
		cout<<"70 gong li she cheng"<<"\n";	
	}
};
//50坦克实现
class TankB90: public Tank
{
public:
	virtual void Shot()
	{
		cout<<"90 gong li she cheng"<<"\n";	
	}
};

//Decorator---------------------------------------------------------------
//装饰者实现-红外线功能
class DecoratorA: public Decorator
{
public:
	DecoratorA(Tank& tank_object):Decorator(tank_object)
	{

	}
	void HongWaixian()
	{
		cout<<"hong wai xian"<<"\n";
	}
public:
	virtual void Shot()
	{
		Decorator::Shot();
		HongWaixian();
	}
};
//装饰者实现-水陆两栖功能
class DecoratorB: public Decorator
{
private:
	void ShuiLuLiangXi()
	{
		cout<<"shui lu liang xi"<<"\n";
	}
public:
	DecoratorB(Tank& tank_object):Decorator(tank_object)
	{

	}
	virtual void Shot()
	{
		Decorator::Shot();
		ShuiLuLiangXi();	
	}
};
//装饰者实现-卫星定位功能
class DecoratorC: public Decorator
{
private:
	void WeiXingDingWei()
	{
		cout<<"wei xing ding wei"<<"\n";
	}
public:
	DecoratorC(Tank& tank_object):Decorator(tank_object)
	{

	}
	virtual void Shot()
	{
		Decorator::Shot();
		WeiXingDingWei();
	}
};

//////////////////////////////////////////////////////////////////////////
// 客户端(调用层)
//////////////////////////////////////////////////////////////////////////
int main()
{
	TankB90* tank_90 = new TankB90();

	Decorator* Decorator_a = new DecoratorA(*tank_90);
	Decorator_a->Shot();
	//Decorator* Decorator_b = new DecoratorB(*Decorator_a);
	//Decorator_b->Shot();

	int a;
	cin>>a;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值