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

来源:互联网 发布:flicker.js 编辑:程序博客网 时间:2024/05/01 12:09

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;}
0 0
原创粉丝点击