c++桥接模式
可以简记为pointer to implement:”指向实现的指针”。
[DP]书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。下面给出这种设计的UML图,其实就是桥接模式的UML图。


#include <bits/stdc++.h>
using namespace std; #define debug(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl class COS
{
public:
COS() {cout << "OS()" << endl;}
virtual ~COS() {cout << "~OS()" << endl;}
virtual void Run(){}
}; class CLinuxOS : public COS
{
public:
CLinuxOS() {cout << "CLinuxOS()" << endl;}
~CLinuxOS() {cout << "~CLinuxOS()" << endl;}
void Run(){cout << "LinuxOS run()" << endl;}
}; class CUnixOS : public COS
{
public:
CUnixOS() {cout << "CUnixOS()" << endl;}
~CUnixOS() {cout << "~CUnixOS()" << endl;}
void Run(){cout << "CUnixOS run()" << endl;}
}; class CComputer
{
public:
CComputer() {cout << "CComputer()" << endl;}
virtual ~CComputer() {cout << "~CComputer()" << endl;}
virtual void InstallOS(COS *os){}
}; class CIBMComputer : public CComputer
{
public:
CIBMComputer() {cout << "CIBMComputer()" << endl;}
~CIBMComputer() {cout << "~CIBMComputer()" << endl;}
void InstallOS(COS *os){ os->Run();}
}; class CHPComputer : public CComputer
{
public:
CHPComputer() {cout << "CHPComputer()" << endl;}
~CHPComputer() {cout << "~CHPComputer()" << endl;}
void InstallOS(COS *os){ os->Run();}
}; int main(int argc, char *argv[])
{
COS *os = new CLinuxOS();
CComputer *cmptr = new CIBMComputer();
cmptr->InstallOS(os);
delete cmptr;
cmptr = NULL;
delete os;
os = NULL;
return ;
}
第二个示例:
#ifndef SOLUTION_H
#define SOLUTION_H struct CImplement;
class CAbstractSample
{
public:
CAbstractSample();
virtual ~CAbstractSample();
void abstractDo();
private:
CImplement *m_impl;
}; #endif // SOLUTION_H
solution.h
#include "solution.h"
#include <iostream>
using namespace std;
struct CImplement{
void doSomething(){
cout << "CImplement doSomething()" << endl;
}
}; CAbstractSample::CAbstractSample():m_impl(new CImplement)
{
cout << "CAbstractSample()" << endl;
} CAbstractSample::~CAbstractSample()
{
if(m_impl != NULL)
{
delete m_impl;
m_impl = NULL;
}
cout << "~CAbstractSample()" << endl;
} void CAbstractSample::abstractDo(){
m_impl->doSomething();
}
solution.cpp
#include "solution.h"
#include <iostream>
using namespace std;
struct CImplement{
void doSomething(){
cout << "CImplement doSomething()" << endl;
}
}; CAbstractSample::CAbstractSample():m_impl(new CImplement)
{
cout << "CAbstractSample()" << endl;
} CAbstractSample::~CAbstractSample()
{
if(m_impl != NULL)
{
delete m_impl;
m_impl = NULL;
}
cout << "~CAbstractSample()" << endl;
} void CAbstractSample::abstractDo(){
m_impl->doSomething();
} int main(int argc, char *argv[])
{
CAbstractSample *as = new CAbstractSample();
as->abstractDo();
delete as;
as = NULL;
return ;
}
$ g++ -g -Wall -std=c++0x solution.cpp main.cpp -o xmain
c++桥接模式的更多相关文章
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...
- PHP设计模式(八)桥接模式(Bridge For PHP)
一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...
- 设计模式(八)桥接模式(Bridge Pattern)
一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视 ...
- 设计模式--桥接模式Bridge(结构型)
一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...
- vmware中虚拟机与主机ping不通,桥接模式,IP地址在同一网段,无法互ping!
现象描述:网卡选用的桥接模式,IP地址在同一个网段,虚拟机内部可以正常上网,但是Guest OS和Host OS无法互ping! 原因:虚拟机里的防火墙没有关闭,导致禁用ping功能. 解决方法:关闭 ...
- 桥接模式/bridge模式/对象结构型
意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...
- Objective-C 桥接模式 -- 简单实用和说明
桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...
- C#设计模式-桥接模式
这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...
- C#设计模式系列:桥接模式(Bridge)
1.桥接模式简介 1.1>.定义 当一个抽象可能有多个实现时,通常用继承来进行协调.抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现.继承机制将抽象部分与它的实现部分固定在一起,使得 ...
- 《JS设计模式笔记》 4,桥接模式
//桥接模式的作用在于将实现部分和抽象部分分离开来,以便两者可以独立的变化. var singleton=function(fn){ var result; return function(){ re ...
随机推荐
- [清华集训2015 Day1]主旋律-[状压dp+容斥]
Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...
- libgdx学习记录25——Rectangle与Circle是否重叠
Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...
- L017-linux系统定时任务crond入门小节
L017-linux系统定时任务crond入门小节 oh my god!how old are you? 怎么老是你?没错,我又来了,哈哈哈,今天是我的生日呢,在这么重要的日子里,必须要更一篇学习小节 ...
- flask-login 整合 pyjwt + json 简易flask框架
现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...
- 软件工程第三次作业(One who wants to wear the crown, Bears the crown.)
最大连续子数组和 题目 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和 ...
- DokuWiki 使用
新建文件夹 修改url, 将新文件夹的名称赋值给url上的id, 如要建一个"DokuWiki"的文件夹,并在文件夹下新增一个"QuickStart"的页面,改 ...
- ReactJS实用技巧(2):从新人大坑——表单组件来看State
不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...
- Linux使用expect实现免手动密码输入,linux免密码登陆
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ###### ...
- 深度学习目标检测综述推荐之 Xiaogang Wang ISBA 2015
一.INTRODUCTION部分 (1)先根据时间轴讲了历史 (2)常见的基础模型 (3)讲了深度学习的优势 那就是feature learning,而不用人工划分的feature engineeri ...
- Fabric Dev开发调试模式的搭建过程
在利用Fabric开发Chaincode的时候,调试Chaincode显得尤为不方便,因为Chaincode正常应该运行在Docker容器中,每次修改Chaincode后想要使其更改生效必须得对Cha ...