设计模式—桥接模式的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 ...
随机推荐
- Ioc及Bean容器(三)
专题一 IoC 接口及面向接口编程 什么是 IoC Spring 的Bean配置 Bean 的初始化 Spring 的常用注入方式 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明 ...
- FileSync文件同步更新工具
FileSync是一款文件同步更新工具,它提供了对一个或多个应用的文件进行管理和同步更并功能,基于MD5的文件对比方式可以使管理者轻易地发布需要更新应用文件.FileSync主要模块包括:服务端,CL ...
- myeclipse-common 找不到
1. 首先打开myeclipse 2. 找到myeclipse的顶部导航栏"myclipse"选项然后打开"Installation Summary..."然后 ...
- 在linux上安装svn
1. 安装svn 输入命令:yum -y install subversion 检查是否安装成功: 输入命令:svn –version 2. 创建代码仓库 输入命令:mkdir -p /usr/loc ...
- Linux官方源、镜像源汇总
本文收录在日常运维杂烩系列 一.站点版 1.企业站 搜狐:http://mirrors.sohu.com/ 网易:http://mirrors.163.com/ 阿里云:http://mirrors. ...
- [UWP]为什么ContentControl的ControlTemplate里放两个ContentPresenter会出问题(绕口)
1. 简单的HeaderedContentControl 上周五收到反馈,在一个ContentControl的ControlTemplate中放两个ContentPresenter会出错.出错的例子是 ...
- Java基础系列--instanceof关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8492158.html instanceof关键字是在Java类中实现equals方法最常使 ...
- eclipse如何将项目上传到码云
把Eclipse项目上传到码云的步骤: 一.将代码提交到本地 1.登录码云:新建项目 2.输入项目名: 3.空项目创建成功如下图: 4.右键点击Eclipse的项目,选择“Team”——>“Sh ...
- HTML+CSS基础(1)-理解什么是HTML和CSS
什么是HTML w3c的解释如下: HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种 ...
- [转]VirtualBox安装CentOS7
本文转自:http://www.cnblogs.com/xyinjie/p/9437049.html 一:.下载CentOS7的镜像 下载地址:https://www.centos.org/downl ...