设计模式—桥接模式的C++实现
这是Bwar在2009年写的设计模式C++实现,代码均可编译可运行,一直存在自己的电脑里,曾经在团队技术分享中分享过,现搬到线上来。
1. 装饰模式简述
1.1 目的
将抽象部分与它的实现部分分离,使它们可以独立地变化。
1.2 适用性
(1) 不希望抽象部分与实现部分之间有一个固定的绑定关系 ,在运行时刻实现部分可以被选择或切换。
(2) 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
(3) 对一个抽象的实现部分的修改对客户不产生影响,即客户代码不需要重新编译。
(4) 对客户完全隐藏抽象的实现部分。
2. 装饰模式结构图

- Abstraction:定义抽象类的接口;维护一个只想Implementor类型对象的指针。
- RefinedAbstraction:扩充由Abstraction定义的接口。
- Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。
- ConcreteImplementor:实现Implementor接口并定义它的具体实现。
3. 桥接模式C++实现示例
手机与手机软件的实现。

代码实现:
Mobile.hpp:
#ifndef Mobile_HPP_
#define Mobile_HPP_ #include "MobileSoft.hpp" class CMobile
{
public:
CMobile(){};
virtual ~CMobile(){} virtual int Run() = ; int SetMobileSoft(CMobileSoft* pSoft)
{
m_pMyMobileSoft = pSoft;
return ;
} //int Start();
//int Shutdown(); protected:
CMobileSoft* GetMobileSoft()
{
return m_pMyMobileSoft;
} private:
CMobileSoft* m_pMyMobileSoft; unsigned int m_uiShape;
unsigned int m_uiColour;
}; #endif /* Mobile_HPP_ */
Nokia.hpp:
#ifndef NOKIA_HPP_
#define NOKIA_HPP_ #include "Mobile.hpp" class CNokia : public CMobile
{
public:
CNokia(){};
virtual ~CNokia(){}; virtual int Run()
{
cout << "Nokia ";
GetMobileSoft()->ImpRun();
return ;
}
}; #endif /* NOKIA_HPP_ */
Moto.hpp:
#ifndef MOTO_HPP_
#define MOTO_HPP_ #include "Mobile.hpp" class CMoto : public CMobile
{
public:
CMoto(){};
virtual ~CMoto(){}; virtual int Run()
{
cout << "Moto ";
GetMobileSoft()->ImpRun();
return ;
}
}; #endif /* MOTO_HPP_ */
MobileSoft.hpp:
#ifndef MobileSOFT_HPP_
#define MobileSOFT_HPP_ #include <cstdio>
#include <iostream> using namespace std; class CMobileSoft
{
public:
CMobileSoft(){};
virtual ~CMobileSoft(){}; virtual int ImpRun() = ;
}; #endif /* MobileSOFT_HPP_ */
MobileAddressList.hpp:
#ifndef MobileADDRESSLIST_HPP_
#define MobileADDRESSLIST_HPP_ #include "MobileSoft.hpp" class CMobileAddressList : public CMobileSoft
{
public:
CMobileAddressList(){};
virtual ~CMobileAddressList(){}; virtual int ImpRun()
{
cout << "Mobile address list." << endl;
return ;
}
}; #endif /* MobileADDRESSLIST_HPP_ */
MobileGame.hpp:
#ifndef MobileGAME_HPP_
#define MobileGAME_HPP_ #include "MobileSoft.hpp" class CMobileGame : public CMobileSoft
{
public:
CMobileGame(){};
virtual ~CMobileGame(){}; virtual int ImpRun()
{
cout << "Mobile game." << endl;
return ;
}
}; #endif /* MobileGAME_HPP_ */
BridgeMain.cpp:
#include <ctime>
#include <iostream>
#include "Mobile.hpp"
#include "Nokia.hpp"
#include "Moto.hpp"
#include "MobileSoft.hpp"
#include "MobileGame.hpp"
#include "MobileAddressList.hpp" using namespace std; int main()
{
CMobile* pMyMobile;
CMobileSoft* pMySoft; pMyMobile = new CNokia;
pMySoft = new CMobileGame; pMyMobile->SetMobileSoft(pMySoft); pMyMobile->Run(); delete pMyMobile;
delete pMySoft; return ;
}

设计模式—桥接模式的C++实现的更多相关文章
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- 跟着ZHONGHuan学习设计模式--桥接模式
转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- java设计模式——桥接模式
一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...
- 【设计模式】Java设计模式 - 桥接模式
[设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- JAVA 设计模式 桥接模式
用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构
- javascript设计模式-桥接模式
在系统中,某些类由于自身逻辑,具有两个或两个以上维度的变化,如何使得该类型可以沿多个方向变化,但又不引入额外的复杂度,这就是桥接模式要解决的问题. 定义:桥接模式(Bridge),将抽象部分与它的实现 ...
- 设计模式 -- 桥接模式(Bridge Pattern)
桥接模式 Bridge Pattern 结构设计模式 定义: 分离抽象部分和实现部分,使他们独立运行. 避免使用继承导致系统类个数暴增,可以考虑桥接模式. 桥接模式将继承关系转化为关联关系,减少耦合, ...
- [Unity 设计模式]桥接模式(BridgePattern)
1.前言 继上一讲IOC模式的基础上继续本讲桥接模式,笔者感觉桥接模式是23种设计模式中桥接模式是最好用但也是最难理解的设计模式之一,23中设计模式就好武侠剧中一本武功秘籍,我们在工作过程中想要熟练运 ...
- 结合JDK源码看设计模式——桥接模式
前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...
随机推荐
- VueJs(7)---计算属性和侦听器
计算属性和侦听器 一. 概述 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="exampl ...
- mysql 开发基础系列20 事务控制和锁定语句(上)
一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...
- 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件项目的托管平台:https://github.com/zlslch/)(图文详解)(博主推荐)
不多说,直接上干货! https://github.com/ 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 同时,大家可以关注我的个人博客: http ...
- Pytorch1.0入门实战一:LeNet神经网络实现 MNIST手写数字识别
记得第一次接触手写数字识别数据集还在学习TensorFlow,各种sess.run(),头都绕晕了.自从接触pytorch以来,一直想写点什么.曾经在2017年5月,Andrej Karpathy发表 ...
- 使用Task异步执行方法_多线程_应用程序池
偶然遇到在执行登录的方法需要发送消息队列导致登录时间过长的问题,从网上查了一些方法,先将一个简单的异步处理程序的小例子展示出来,供大家参考: 备注:该方法是从应用程序程序所在的线程池中获取线程,第一次 ...
- C# 7.1中default关键字的新用法
default 关键字有两类用法 switch语句中指定默认标签 默认值表达式 switch 语句 int caseSwitch = 1; switch (caseSwitch) { case 1: ...
- 【转载】 IIS服务器防盗链设置
在实际运行的服务器环境中,我们自己网站中的资源一般不希望被外部网站引用,被外部网站引用IIS网站中的资源文件,一是会加重了服务器的负担,二是占用了你自己服务器的外网带宽资源,因此我们希望防止盗链这种情 ...
- 重装系统之 Win10 镜像安装
首先配置武器的第一步是要选择武器的性质,以前win10 刚出的时候有很多问题,导致大家都不太喜欢用,但是现在Win10 经过一系列的优化,已经相当稳定靠谱,但是网上很多重装系统的教程参差不齐,导致博主 ...
- c# 静态构造函数与构造函数的调用先后
先上代码: 测试类: /// <summary> /// 构造函数 /// </summary> public RedisHelper() { Console.WriteLin ...
- 本地yum仓库搭建,使用163yum源
如果内部网络没有连接Internet就在本地配置yum仓库 将操作系统镜像上传到服务器中,进行挂载 mount –o loop rhel-server-6.7-x86_64-dvd.iso /mnt ...