C++ Bridge 设计模式

C++ Bridge 设计模式

 

Bridge模式是应用最广泛也是我个人比较喜欢的一个C++设计模式之一。

Bridge模式意图:降低抽象和实现之间的耦合。

面向对象系统设计和分析中最重要的一点就是:高内聚,低耦合。Bridge模式使得抽象和实现能够相对独立。

 

 

Bridge模式结构图:

 

        

            

 

Bridge模式的关键在于Abstraction的派生类中维护了一个纸箱Implementor类的指针。

让Implentor的派生类来去实现。从而实现了抽象和实现的相对独立。

 

参考代码:

 

#pragma once
//Abstraction.h
class Abstraction
{
public:
Abstraction(void){};
virtual ~Abstraction(void){};

virtual void Operation() = 0;
};

 

 

#pragma once
//Implementor.h
class Implementor
{
public:
Implementor(void){};
virtual ~Implementor(void){};

virtual void OperationImp() = 0;
};

 

 

 

#pragma once

//ConcreteImplementorA.h
#include "implementor.h"

class ConcreteImplementorA :
public Implementor
{
public:
ConcreteImplementorA(void);
~ConcreteImplementorA(void);

void OperationImp();
};

 

#pragma once

//ConcreteImplementorB.h
#include "implementor.h"

class ConcreteImplementorB :
public Implementor
{
public:
ConcreteImplementorB(void);
~ConcreteImplementorB(void);

void OperationImp();
};

 

 

#pragma once

//RefinedAbstraction.h
#include "abstraction.h"
#include "Implementor.h"

class Implementor;

class RefinedAbstraction :
public Abstraction
{
public:
RefinedAbstraction(void);
RefinedAbstraction(Implementor *imp);
~RefinedAbstraction(void);

void Operation();

private:
Implementor *m_imp;

};

 

#include <iostream>
#include "ConcreteImplementorA.h"

using namespace std;

//ConcreteImplementonA.cpp
ConcreteImplementorA::ConcreteImplementorA(void)
{
}

ConcreteImplementorA::~ConcreteImplementorA(void)
{
}

void ConcreteImplementorA::OperationImp()
{
cout << "Hi, I am in ConcreteImplementorA" << endl;
}

 

 

#include <iostream>
#include "ConcreteImplementorB.h"

using namespace std;

//ConcreteImplementorB.cpp
ConcreteImplementorB::ConcreteImplementorB(void)
{
}

ConcreteImplementorB::~ConcreteImplementorB(void)
{
}

void ConcreteImplementorB::OperationImp()
{
cout << "Hi, I am in ConcreteImplementorB" << endl;
}

 

 

#include <iostream>
#include "RefinedAbstraction.h"

using namespace std;

//RefinedAbstraction.cpp
RefinedAbstraction::RefinedAbstraction(void)
{
m_imp = NULL;

}

RefinedAbstraction::~RefinedAbstraction(void)
{
}

RefinedAbstraction::RefinedAbstraction(Implementor *imp)
{
m_imp = imp;
}

void RefinedAbstraction::Operation()
{
m_imp->OperationImp();
}

 

#include "Abstraction.h"
#include "ConcreteImplementorA.h"
#include "ConcreteImplementorB.h"
#include "RefinedAbstraction.h"

//main.cpp
int main()
{

ConcreteImplementorA *pImpA = new ConcreteImplementorA;
ConcreteImplementorB *pImpB = new ConcreteImplementorB;
Abstraction *objA = new RefinedAbstraction(pImpA);
Abstraction *objB = new RefinedAbstraction(pImpB);

objA->Operation();
objB->Operation();

}

 

 

 

我个人 非常欣赏也非常推崇Bridge模式。

时间: 2024-10-19 13:56:00

C++ Bridge 设计模式的相关文章

从重构的角度学习bridge设计模式

从重构的角度学习bridge设计模式 Bridge模式是一个在实际系统中经常应用的模式.它最能体现设计模式的原则针对接口进行编程,和使用聚合不使用继承这两个原则. 由于我们过分的使用继承,使类的结构过于复杂,不易理解,难以维护.特别是在Java中由于不能同时继承多个类,这样就会造成多层继承,维护更难. Bridge模式是解决多层继承的根本原因.如果你在实现应用中一个类,需要继承两个以上的类,并且这两者之间又持有某种关系,它们两个都会有多种变化. Bridge模式是把这两个类,分解为一个抽象,一个

连载:面向对象葵花宝典:思想、技巧与实践(39) - 设计原则 vs 设计模式

又是设计原则,又是设计模式,到底该用哪个呢? ============================================================================= 在"设计模型"一章中,我们提到设计原则和设计模式是互补的,设计原则和设计模式互补体现在:设计原则主要用于指导"类的定义"的设计,而设计模式主要用于指导"类的行为"的设计.   举一个很简单的例子:假设我们要设计一个图形类Shape,这个类既支持三角

Java编程准则

编程|准则 Java编程准则内容摘录自:<Java 编程思想>第2版<附录C J a v a 编程准则>/(美) 埃克尔(Eckel,B)著:候捷译的,机械工业出版社,2002.9 版权归原作者和原出版社. 这份附录所提供的建议,可以帮助你进行低阶的程序设计,并帮助你写码. 当然,这些都只是一种方针而不是硬性规则.你应该视它们为一种灵感来源.记住,某些情况下你需要加以变通或甚至打破规则.设计 1. 优雅需要付出代价.从短期利益来看,对某个问题提出优雅的解决方法,似乎可能花你更多的时

设计模式学习笔记(四)—Bridge桥接模式

<设计模式>一书对Bridge是这样描述的: 将抽象与其实现解耦,使它们都可以独立地变化. 大致意思是说:将一组实现与另一组使用他们的对象分离.这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类).下面 是<Design Patterns Explained>书中的例子.其结构图如下: 下面是它的实现: abstract class Shape{ protected Drawing myDrawing; abstract public

C#设计模式之桥梁设计模式(Bridge)

一.桥梁(Bridge)模式 桥梁模式是一个非常有用的模式,也是比较复杂的一个模式.熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助.理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格. 注:<Java与模式>一书认为Bridge模式不是一个使用频率很高的模式,我不太赞同,我认为Bridge模式中蕴涵了很多设计模式的关键思想在里面,所以我这里采纳了<Design Patterns Explai

.NET设计模式(9):桥接模式(Bridge Pattern)

概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 意图 将抽象部分与实现部分分离,使它们都可以独立的变化.[GOF <设计模式>] 结构图 图1 Bridge模式结构图 生活中的例子 桥接模式将抽象部分与它的实现分离,使它们能够独立地变化.一个普通的开关控制的电灯.电风扇等等,都是桥接的例子.开关的目

设计模式(六)桥连模式Bridge(结构型)

设计模式(六)桥连模式Bridge(结构型) 1. 概述       在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: •第一种设计方案是为每一种形状都提供一套各种颜色的版本. •第二种

C++设计模式编程中使用Bridge桥接模式的完全攻略_C 语言

桥接模式将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式典型的结构图为: 在桥接模式的结构图中可以看到,系统被分为两个相对独立的部分,左边是抽象部分,右边是实现部分,这两个部分可以互相独立地进行修改:例如上面问题中的客户需求变化,当用户需求需要从 Abstraction 派生一个具体子类时候,并不需要像上面通过继承方式实现时候需要添加子类 A1 和 A2 了.另外当上面问题中由于算法添加也只用改变右边实现(添加一个具体化子类),而右边

C#设计模式(8)——桥接模式(Bridge Pattern)

原文:C#设计模式(8)--桥接模式(Bridge Pattern) 一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是--把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控器都继承这个抽象类,具体设计类图如下: 这样的实现使得每部不同型号的电视都有自己遥控器实现,这样的设计对于电视机的改变可以很好地应对,只需要添加一个派生类就搞定了,但随着时间的推移,用户需要改变遥控器的功能,如:用户可能