设计模式学习--桥接模式

原创 2015年07月09日 23:11:32

首先,桥接模式是对象结构型模式的一种。桥接模式的定义:
将抽象与实现部分分离,使它们可以独立的发生变化。要说明的一点是,让抽象与实现分离,并不是说让抽象类与其派生类分离,因为这没有任何的意义。实现指的是抽象类和他的派生类用来实现自己的对象。更简单的理解就是实现系统可能有多种分类,每一种分类都有可能发生变化,那么就把这种多角度分离出来让他们独立的发生变化,减少他们之间的耦合。
桥接模式的结构图如下
桥接模式
适用性
1 你不希望在抽象和它的实现部分之间有一个固定的绑定关系
2 类的抽象以及他的实现部分应该可以通过生成子类的方法加以扩充。
3 将一个抽象的实现部分的修改应对一个客户不造成影响,即客户的代码不需重新编译
4 你想对客户完全隐藏抽象的实现部分
5 有许多类要生成,这样一种类层次结构说明你必须将一个对象分解成两个部分
6 你想在多个对象之间共享实现(可能使用引用计数),但同时要求客户并不知道这一点
协作
Abstraction将client的请求转发给他的Impletement对象
优点
1 分离接口与具体的实现部分,有助于分层,从而产生更好的结构层次,系统的高层部分仅需知道Abstraction和Impletementor
2 提高可扩充性
3 实现细节对客户透明
注意的问题
1 但只有一个Impletementor的时候,没必要有一个抽象类。但如果你想改变一个类的实现不会影响现有的客户程序时,模式的分离机制还是非常有用的。客户只需重新连接而不需要重新编译。
2 创建正确的Implementor类
3 共享Impletementor对象
4 不能采用多重继承实现真正的桥接模式。例如,一个类可以用Public方式继承Abstraction而已private方式继承ConcreteImpeltementor,但由于这种方法依赖于静态继承,它将实现部分与接口固定不变的绑定在一起。

// BridgeModel.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Brand.h"
#include "HandSetGame.h"
#include "HandsetAddressList.h"
#include "BrandM.h"
#include "BrandN.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Brand* br = new BrandN();
    br->setSoft(new HandsetGame);
    br->run();

    br->setSoft(new HandsetAddressList);
    br->run();

    delete br;
    br = nullptr;

    Brand* brM = new BradM();
    brM->setSoft(new HandsetGame);
    brM->run();

    brM->setSoft(new HandsetAddressList);
    brM->run();

    delete brM;
    brM = nullptr;

    return 0;
}

/************************************************************************
             @fileName:Brand.h 
             @function: 桥接模式的抽象类
             @author: jaime
             @ver: 1.0.0
************************************************************************/

#pragma once

#include "HandsetSoft.h"

class Brand
{
public:
    Brand();
    ~Brand();
    void setSoft(HandsetSoft* soft);
    virtual void run() = 0;
private:
protected:
    HandsetSoft* m_soft;
};


#include "Brand.h"


Brand::Brand()
{
}

Brand::~Brand()
{
}

void Brand::setSoft(HandsetSoft* soft)
{
    m_soft = soft;
}

/************************************************************************
           @fileName:BrandN.h 
           @function: 桥接模式的实现类
           @author: jaime
           @ver: 1.0.0
************************************************************************/

#pragma once

#include "Brand.h"

class BrandN : public Brand
{
public:
    BrandN();
    ~BrandN();
    virtual void run();
private:

};

#include "BrandN.h"


BrandN::BrandN()
{
}

BrandN::~BrandN()
{
}

void BrandN::run()
{
    m_soft->run();
}

/************************************************************************
           @fileName:BrandM.h 
           @function: 桥接模式的实现类
           @author: jaime
           @ver: 1.0.0
************************************************************************/

#pragma once

#include "Brand.h"

class BradM : public Brand
{
public:
    BradM();
    ~BradM();
    virtual void run();
private:

};


#include "BrandM.h"

BradM::BradM()
{

}

BradM::~BradM()
{

}

void BradM::run()
{
    m_soft->run();
}

/************************************************************************
          @fileName:HandsetSoft.h 
          @function: 桥接模式的抽象类
          @author: jaime
          @ver: 1.0.0
************************************************************************/

#pragma once

class HandsetSoft
{
public:
    HandsetSoft();
    ~HandsetSoft();
    virtual void run() = 0;
private:

};

/************************************************************************
           @fileName:HandSetGame.h 
           @function: 桥接模式的具体实现类
           @author: jaime
           @ver: 1.0.0
************************************************************************/
#pragma once

#include "HandsetSoft.h"

class HandsetGame : public HandsetSoft
{
public:
    HandsetGame();
    ~HandsetGame();
    virtual void run();
private:

};

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

using namespace std;

HandsetGame::HandsetGame()
{
}

HandsetGame::~HandsetGame()
{
}

void HandsetGame::run()
{
    cout << "运行手机游戏" << endl;
}

/************************************************************************
             @fileName:HandsetAddressList.h 
             @function: 桥接模式的具体实现类
             @author: jaime
             @ver: 1.0.0
************************************************************************/

#pragma once

#include "HandsetSoft.h"

class HandsetAddressList : public HandsetSoft
{
public:
    HandsetAddressList();
    ~HandsetAddressList();
    virtual void run();
private:

};

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

using namespace std;

HandsetAddressList::HandsetAddressList()
{
}

HandsetAddressList::~HandsetAddressList()
{
}

void HandsetAddressList::run()
{
    cout << "运行手机通讯录" << endl;
}

如果要加上一个其他的功能类,如Mp3,只需继承Soft就可以实现了,加品牌的话就继承Brand实现就可以了。两边可以独立的发生变化。

设计模式(结构型)之桥接模式(Bridge Pattern)

桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在多个独立变化的维度,通过该模式可以将这多个维度分离出来,使他们可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将多个独...
  • yanbober
  • yanbober
  • 2015年04月29日 21:15
  • 3713

浅谈JAVA设计模式之——桥接模式(Bridge)

一、概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 二、适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者...
  • l1028386804
  • l1028386804
  • 2015年05月03日 12:25
  • 5417

IOS 设计模式 桥接模式(bridge)

转自:http://www.cnblogs.com/eagle927183/p/3483890.html 引言   在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多...
  • lcg910978041
  • lcg910978041
  • 2016年04月23日 21:12
  • 521

大话设计模式—桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。主要解决:在有多种可能会变化的情况下,...
  • lmb55
  • lmb55
  • 2016年04月02日 15:27
  • 1564

大话设计模式-----(九)桥接模式、命令模式

桥接模式将抽象部分与他的实现部分分离,使他们都可以独立地变化实现指的是抽象类和他的派生类用来实现自己的对象就像不同牌子的手机,会有不同的功能,要是抽象手机,然后逐个添加功能,很多功能大家都有,但也有一...
  • qq_28295425
  • qq_28295425
  • 2017年04月03日 10:46
  • 375

JAVA开发的23种设计模式之 --- 桥接模式

桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.应用场景 实现系统可能有多个角度分类,每一种...
  • yeguxin
  • yeguxin
  • 2017年08月17日 18:31
  • 168

菜鸟版JAVA设计模式-从抽象与实现说桥接模式

桥接模式,初学的时候其实很不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到。其实我学习是一件比较痛苦的事情,因为我必须要知道来龙去脉才能学的进去,所以,很快我就对这个命名产生了兴趣,桥接? 嗯...
  • lulei9876
  • lulei9876
  • 2014年10月22日 15:26
  • 2148

【C#设计模式-桥接模式】

一.桥接模式定义: 桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化。 二.桥接模式的实现: 我先引进一个生活中的例子,这里引用一个电视遥控器的例子,对于每一个牌子的遥控器,都有对于的遥控器...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年04月29日 11:23
  • 1320

Android设计模式应用-桥接模式

桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化 看看关系图: 实现代码: 先定义接口: public inter...
  • u014737138
  • u014737138
  • 2016年04月03日 21:18
  • 513

iOS设计模式-桥接

桥接的概念以及在Objective-C中的实现
  • AddyChen
  • AddyChen
  • 2015年07月19日 17:16
  • 1554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习--桥接模式
举报原因:
原因补充:

(最多只允许输入30个字)