设计模式目录
桥接模式-坦克大战-c#
桥接模式-坦克大战-js
几种模式的对比分析
目的:某个机能有两个维度的变化,那么把这个机能分别交给两个对象对负责,让他俩组合来完成任务。
这样当构建丰富多彩的机能时,只需要更小的复杂度就能实现。
记录:这个模式其实本身是面向对象编程的基础,任何两个对象都可以发生桥接,那是不是发生了桥接就叫桥接模式呢。理论上这么说应该也没有问题,但桥接这么模式强调的时桥接后形成组合功能的丰富。
https://download.csdn.net/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---------------------------------------------------------------
class TankB70: public Tank
{
public:
virtual void Shot()
{
cout<<"70 gong li she cheng"<<"\n";
}
};
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;
}