Bridge模式

在面向对象的开发过程中,要做到2点:1、高内聚(cohesion)。2、松耦合(coupling)。可是在实际开发过程中难以把握,比如会遇到这种问题:

1)客户给了一个需求,之后我们用一个类A来实现。

2)客户的需求有了变化,要用到2个算法来实现。于是我们通过定义一个抽象基类A,在用两个详细类A1和A2实现这两个算法。

3)客户需求又有了变化,要求在2个操作系统上实现。我们再抽象一个层次,不同操作系统抽象为A0和A1,每一个操作系统上有2个算法,在实现为A00、A01和A10、A11,总共同拥有4个类。

4)客户需求假设再有变化,那么我们又要又一次设计。

Bridge模式正是解决问题的。

Bridge模式的核心在于将抽象部分和实现分离,它们两者能够独立的变化。

它的类结构图例如以下:

以下是实现的代码

//Abstraction.h

//Abstraction.h

#ifndef _ABSTRACTION_H_
#define _ABSTRACTION_H_ class AbstractionImp; class Abstraction
{
public:
virtual ~Abstraction();
virtual void Operation() = 0 ;
protected:
Abstraction();
}; class RefinedAbstraction :public Abstraction
{
public:
RefinedAbstraction(AbstractionImp* imp);
~RefinedAbstraction();
void Operation() ;
private:
AbstractionImp* _imp;
}; #endif

//Abstraction.cpp

#include"Abstraction.h"
#include"AbstractionImp.h" Abstraction::Abstraction()
{ }
Abstraction::~Abstraction()
{ } RefinedAbstraction::RefinedAbstraction(AbstractionImp* imp)
{
_imp = imp;
}
RefinedAbstraction::~RefinedAbstraction()
{ }
void RefinedAbstraction::Operation()
{
_imp->Operation(); }

//AbstractionImp.h

//AbstractionImp.h

#ifndef _ABSTRACTIONIMP_H_
#define _ABSTRACTIONIMP_H_
class AbstractionImp
{
public:
virtual ~AbstractionImp();
virtual void Operation() = 0;
protected:
AbstractionImp();
}; class ConcreteAbstractionImpA :public AbstractionImp
{
public:
ConcreteAbstractionImpA();
~ConcreteAbstractionImpA();
virtual void Operation();
}; class ConcreteAbstractionImpB :public AbstractionImp
{
public:
ConcreteAbstractionImpB();
~ConcreteAbstractionImpB();
virtual void Operation();
};
#endif

//AbstractionImp.cpp

#include"AbstractionImp.h"
#include<iostream>
using namespace std;
AbstractionImp::AbstractionImp()
{ }
AbstractionImp::~AbstractionImp()
{ } ConcreteAbstractionImpA::ConcreteAbstractionImpA()
{ }
ConcreteAbstractionImpA::~ConcreteAbstractionImpA()
{ } void ConcreteAbstractionImpA::Operation()
{
cout << "ConcreteAbstractionImpA Operation" << endl;
} ConcreteAbstractionImpB::ConcreteAbstractionImpB()
{ }
ConcreteAbstractionImpB::~ConcreteAbstractionImpB()
{ } void ConcreteAbstractionImpB::Operation()
{
cout << "ConcreteAbstractionImpB Operation" << endl;
}

//main.cpp

#include"Abstraction.h"
#include"AbstractionImp.h" int main()
{
AbstractionImp* impA = new ConcreteAbstractionImpA();
AbstractionImp* impB = new ConcreteAbstractionImpB(); Abstraction* absA = new RefinedAbstraction(impA);
Abstraction* absB = new RefinedAbstraction(impB); absA->Operation();
absB->Operation(); return 0; }

Bridge模式的更多相关文章

  1. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

  2. Abstract Server模式,Adapter模式和Bridge模式

    简易的台灯 Abstract Server模式 谁拥有接口. 接口属于它的客户,而不是它的派生类. 接口和客户之间的逻辑关系,强于接口和其派生类的逻辑关系. 逻辑关系和实体关系的强度是不一致的.在实体 ...

  3. Bridge 模式

    Bridge 模式将抽象和行为划分开来,各自独立,但能动态的结合.在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是 ...

  4. 【结构型】Bridge模式

    桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化.简简单单的一句话,却已经是站在了更高抽象层面上来看待.设计.解决问题.平常我们多是对具体问题进行分析.抽象,然后就开始设计,这对多数情况下基 ...

  5. 【设计模式】Bridge模式(桥接模式)

    最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...

  6. 设计模式之桥接模式(Bridge模式)

    我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根据想象描绘出格式图样.而毛笔下的国画更是工笔写意,各展风采.而今天我们的故事从蜡笔与毛笔说起. 设想要绘制一幅图画,蓝天.白云.绿树.小鸟 ...

  7. 设计模式之——bridge模式

    Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式. 这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧. 首先,我们要了解到,为什么需 ...

  8. java 实现Bridge模式(转)

    原文:http://chjking.blog.163.com/blog/static/6439511120081152534252/ 看了网上一些关于咖啡加奶的例子,觉得真是天下文章一大抄,不管好的坏 ...

  9. (原创)composite模式和bridge模式是天生的好朋友

    composite模式的意图是:将对象组合成树形结构以表示“部分-整体”的层次结构.composite使得用户对单个对象和组合对象的使用具有一致性.它的类图如下: composite模式的实现分为透明 ...

  10. Java设计模式(6)桥模式(Bridge模式)

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

随机推荐

  1. 怎样在Android.mk上加宏定义【转】

    本文转载自:http://blog.csdn.net/ttxgz/article/details/7591282 很简单, LOCAL_CFLAGS += -DWHATEVERDEFINE 就可以了

  2. spring框架spring之HibernateTemplate

    转自:https://blog.csdn.net/acmman/article/details/44652207

  3. AtCoder Beginner Contest 054

    1. A - One Card Poker 水题,直接输出大小. 2. B - Template Matching 暴力,每个位置枚举,比较. 3. C - One-stroke Path n的大小只 ...

  4. 浅析CLR的事件

    文章目录:     1.C#(.net framework框架)中的事件以及特点 2.事件的组成部分 3.编辑器如何实现事件的         4.显式实现事件 1.C#(.net framework ...

  5. Linux运维最佳实践之网站调优

    高性能静态网站: 1.静态页面中针对图片进行浏览器(客户端)缓存,如公共JavaScript(jQuery,jQuery-1.12.1.min.js)进行缓存 2.对网站输入内容压缩(gzip) 3. ...

  6. RDS中的.frm和.ibd文件转换为sql文件

    --- 转自他人 mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好 ...

  7. showdialog

    在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show). 区别: 模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体.模态窗体不允许操作其他窗体,非模态窗体 ...

  8. 重温前端基础之-css浮动与清除浮动

    文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行,并在每行中按从左到右的顺序排放元素.脱离文 ...

  9. nodejs -- crypto MD5签名

    MD5使用方法: const crypto = require('crypto'); var obj = crypto.createHash('md5'); // 可多次调用 update obj.u ...

  10. 【Linux】SecureCRT中按退格键出现^H

    分两步: ①SecureCRT上部的“选项”→“会话选项”→终端→仿真→映射键→其他映射→Backspace发送delete(B) 勾选中,确定 ②SecureCRT上部的“选项”→全局选项→常规→默 ...