Bridge模式

  • Bridge模式

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;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 23:07:31

Bridge模式的相关文章

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

我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根据想象描绘出格式图样.而毛笔下的国画更是工笔写意,各展风采.而今天我们的故事从蜡笔与毛笔说起. 设想要绘制一幅图画,蓝天.白云.绿树.小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦.毕竟细细的蜡笔要涂出一片蓝天,是有些麻烦.如果有可能,最好有套大号蜡笔,粗粗的蜡笔很快能涂抹完成.至于色彩吗,最好每种颜色来支粗的,除了蓝天还有绿地呢.这样,如果一套12种颜色的蜡笔,我们需要两套24支,同种颜色的一粗一细.呵呵,画还没画,开始做梦了

敏捷软件开发 – ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式

设计运行在简易台灯中的软件.台灯由一个开关和一盏灯组成.可以询问开关是开着还是关着,也可以让灯打开或者关闭. 下面设计了一个简易的模型.Switch对象可以轮询实际开关的状态,并且可以发送相应的turnOn和turnOff消息给Light. 这个设计违反了两个设计原则:依赖倒置(DIP)和开放-封闭(OCP).对DIP的违反是明显的,Switch依赖了具体类Light.DIP告诉我们要优先依赖于抽象类.对OCP的违反虽然没有那么明显,但是更加切中要害.我们之所以不喜欢这个设计是因为它迫使我们在任

VM虚拟机网络在Bridge模式下,本机不能连接SSH问题的解决

今天遇到了一个很奇怪的问题. VM虚拟机网络连接原先在NAT模式下,本机通过SSH访问没有任何问题,但切换到Bridge模式后,SSH死活都连接不上.以为是自己SSH设置或iptables的问题,但怎么调都不对.偶然在另一台机器通过SSH访问,却顺利连接上了.于是放“狗”狂搜,终于找到了问题解决的方法,只需要把本机网卡属性->配置->高级中,将"Offload Checksum"属性设成"Disable",一切就正常了.

桥(Bridge)模式

Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种: 这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩:这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了.实际应用上,常常有可能在这多个concrete class之间有概念上重叠.那么需要我们把抽象共同部分和行为共同部

Java桥模式(Bridge模式)

Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种: 这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩:这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了. 实际应用上,常常有可能在这多个concrete class之间有概念上重叠.那么需要我们把抽象共同部分和行为共同

设计模式(java)--Bridge模式

转自:吕震宇 http://www.cnblogs.com/zhenyulu/articles/67016.html#!comments 我想大家小时候都有用蜡笔画画的经历吧.红红绿绿的蜡笔一大盒,根据想象描绘出格式图样.而毛笔下的国画更是工笔写意,各展风采.而今天我们的故事从蜡笔与毛笔说起. 设想要绘制一幅图画,蓝天.白云.绿树.小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦.毕竟细细的蜡笔要涂出一片蓝天,是有些麻烦.如果有可能,最好有套大号蜡笔,粗粗的蜡笔很快能涂抹完成.至于色彩吗,最

C++设计模式实现--桥接(Bridge)模式

一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP_Win系统也不能运行在IBM上. 这时如果有一家新公司Apple出了一台新电脑,那么这个公司也要开发自己的系统 Apple_Win,Apple_Linux. 其实,上面几家公司开发的软件和硬件在很多地方都有相似之处,如果每家公司都做自己的系统,这意味着资源和人员的极大浪费. 这时,无论出现新的系统

Bridge 模式

Bridge 模式将抽象和行为划分开来,各自独立,但能动态的结合.在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是包含在一个对象中,但是,在有的情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥模式的用处. 1 ///////////////Abstraction.h///////////// 2 #pragma once 3 class AbstractionImp ; 4 class Ab

Structual设计--Bridge模式

1.意图 将抽象部分与它的实现部分分离,使他们都可以独立地变化. 2.别名 Handle/Body 3.动机 当一个抽象对象可能有多个实现时,通常用继承来协调它们.抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现.但是此方法有时不够灵活.继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改.扩充和重用. 4.适用性 以下情况使用Bridge模式: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以