设计模式之桥接模式

来源:互联网 发布:网络设备管理规范 编辑:程序博客网 时间:2024/06/07 03:41

定义:是抽象部分与它的实现部分分离,使得他们都可以独立地变化

在说桥接模式之前,我们先说一个面向对象的原则,就是合成/聚合复用原则

合成/聚合复用原则:在面向对象的设计中,尽量使用合成/聚合,尽量不要使用类的继承

聚合表示的是一种弱拥有的关系,体现的是A对象可以包含B对象,但是B对象却不是A的一部分

每个大雁都是属于一个雁群,一个雁群可以有多只大雁,这就是部分与整体的关系,大雁的死亡,并不会影响雁群的消失

合成表示的是一种强拥有的关系,体现了严格的部分与整体的关系,部分和整体的生命周期是一样的

比如一个人有两个胳膊,那么胳膊就是人的一部分,并且生命周期相同,这就是一种强拥有

举个例子来讲,这个例子是大话设计模式上桥接模式的例子,对于手机有不同的牌子,比如手机M,手机N,每个手机又有不同的
应用,但是有一些应用是相同的,比如手机M有手机M的通讯录,手机N有手机N的通讯录,这个时候如果我们要给手机M装一个游戏
给手机N也要装一个游戏,这两个游戏是相同的,我们安装游戏的步骤是:首先这个游戏是独立的,然后把它装给手机M,然后在

把它装给手机N,也不是先对手机M制作一个游戏,然后在针对手机N只做一个游戏,这就是将手机与应用分离开来,这个时候如果我们

又要给手机M和手机N装一个聊天工具,那么这个聊天工具肯定先属于应用里面,然后再加到手机M和手机N

我们可以写一下这个例子的代码

#include<iostream>using namespace std;//手机软件类class HandsetSoft{public:virtual void run() = 0;};//通讯录class HandsetAddresslist :public HandsetSoft{public:void run(){cout << "运行手机通讯录" << endl;}};//游戏class HandsetGame :public HandsetSoft{public:void run(){cout << "运行手机游戏" << endl;}};//抽象手机品牌类class HandsetBrand{protected://手机中有手机软件HandsetSoft* soft;public:virtual void show() = 0;//设置手机软件void setSoft(HandsetSoft* soft){this->soft = soft;}virtual void run() = 0;};class HandsetBrandM :public HandsetBrand{public:void show(){cout << "手机品牌M" << endl;}void run(){soft->run();}};class HandsetBrandN :public HandsetBrand{public:void show(){cout << "手机品牌N" << endl;}void run(){soft->run();}};int main(void){HandsetBrand* brand = new HandsetBrandM();HandsetSoft* soft = new HandsetAddresslist();brand->show();brand->setSoft(soft);brand->run();return 0;}
这个时候我们雁假如一款手机K和一个手机聊天应用,我们只需加上一些代码就可以了

class HandsetBrandK :public HandsetBrand{public:void show(){cout << "手机品牌K" << endl;}void run(){soft->run();}};class HandsetChat :public HandsetSoft{public:void run(){cout << "运行手机聊天工具" << endl;}};
这也满足面向对象最重要的原则:开闭原则
下面我们看一看桥接模式具体的代码
//实现class Implementor{public:virtual void Operation() = 0;};class ConcreteImplementorA :public Implementor{public:void Operation(){cout << "集体实现A的方法执行" << endl;}};class ConcreteImplementorB :public Implementor{public:void Operation(){cout << "集体实现B的方法执行" << endl;}};//抽象class Abstraction{protected:Implementor* imple;public:void setImplementor(Implementor* imple){this->imple = imple;}virtual void Operation() = 0;};class RefinedAbstraction :public Abstraction{public:void Operation(){imple->Operation();}};
实现系统可能有多角度的分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合
适用情况:
1、当不希望在抽象和它的实现部分之间有一个固定的绑定关系时
2、当类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充时
3、当对一个抽象类的实现部分的修改应对客户端不产生影响时


原创粉丝点击