您的位置:首页 > 编程语言 > C语言/C++

利用桥接模式实现手机品牌和手机软件之间的解耦 C++

2016-03-27 15:06 531 查看

1. 合成/聚合复用原则

在面向对象编程过程中, 继承是一个非常强大的工具, 它体现出子类和父类之间的强耦合关系。对象的继承关系在编译的时候, 就已经决定好了, 无法在运行时候做改变。以至于父类的更改会影响到子类。

聚合: 表示一种较弱的 拥有关系,A 对象可以包含 B 对象, 而B 对象不是 A 的一部分

合成: 表示一种较强的 拥有关系, 体现的是严格的部分和整体的关系, 并且部分和整体的声明周期一般是一致的

合成/ 聚合原则的好处是, 优先使用对象的合成和聚合将有助于保持类的封装,并被集中在单个任务上,这样的话, 类和类的继承层次会保持较小的规模, 并且不太可能会增长成为不可控制的庞然大物。

2.桥接模式

他将抽象部分和实现部分分离开来, 使他们都可以独立的变化。

这里所说的将抽象和他的实现分离, 指的是抽象类和他的派生类用来实现自己的对象, 而不是非得构成一个继承关系。

由于实现的方式可以有很多种, 桥接模式的核心意图就是把这些实现独立出来, 让他们独立的变化, 每种变化的实现不会影响到另外一个的实现, 从而可以灵活的应对需求的变化

UML 图:



code:

handsoft.h

#ifndef _HANDSOFT_H_
#define _HANDSOFT_H_

#include <iostream>
using std::cout;
using std::endl;

/************************************************************************/
/* 软件基类                                                             */
/************************************************************************/
class CHandsetSoft{
public:
virtual void run() const = 0;
};

/************************************************************************/
/* 手机游戏                                                             */
/************************************************************************/
class CHandsetGame : public CHandsetSoft{
public:
void run() const override{ cout << "运行手机游戏" << endl; }
};

/************************************************************************/
/* 通讯录                                                               */
/************************************************************************/
class CHandsetContact : public CHandsetSoft{
public:
void run() const override{ cout << "通讯录 " << endl; }
};

#endif // _HANDSOFT_H_


handbrand.h

#ifndef _HANDBRAND_H_
#define _HANDBRAND_H_

#include "handsoft.h"

/************************************************************************/
/* 手机品牌                                                             */
/************************************************************************/
class CHandBrand{
public:
virtual void run() const {}
void setHandsetSoft(CHandsetSoft * soft){ this->soft = soft; }

protected:
CHandsetSoft * soft;
};

/************************************************************************/
/* N 手机品牌                                                           */
/************************************************************************/
class HandBrandN : public CHandBrand{
public:
void run() const { soft->run(); }
};

/************************************************************************/
/* M 手机品牌                                                           */
/************************************************************************/
class HandBrandM : public CHandBrand{
public:
void run() const { soft->run(); }
};

#endif // _HANDBRAND_H_


main.cpp

#include "handsoft.h"
#include "handbrand.h"

#include <iostream>

using namespace std;

int main(){
CHandBrand * brand = new HandBrandN();
brand->setHandsetSoft(new CHandsetGame());
brand->run();

brand->setHandsetSoft(new CHandsetContact);
brand->run();

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: