利用桥接模式实现手机品牌和手机软件之间的解耦 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; }
相关文章推荐
- 用C语言写的一个小的银行管理程序
- C++中“头文件”的定义和使用
- VC++6.0 unexpected end of file while looking for precompiled header directive
- c++11 :unique_ptr
- C++sort函数的用法
- c++ extern及其对struct的使用
- 字符型指针变量与字符数组的区别
- 比较C++中的4种类型转换方式
- C++学习笔记——第11章 运算符法重载
- C语言学习笔记之数据类型
- C++用指针处理数组元素
- C++中引用详解
- va_list
- c++实验2-标准体重
- C++11智能指针之使用shared_ptr实现多态
- C语言完成2048,辣鸡代码(#滑稽#)
- C++中vector的用法
- 孙敬哲的c++上机实验2-2
- c语言实验
- C语言中从标准输入读取几行输入,并打印到标准输出上两种方法