2.结构性模式

2.2  BRIDGE模式

别名:handle/body

这个模式体现了组合相对于继承的优势。

2.2.1动机

当一个抽象可能有多个实现时,通经常使用继承来协调它们。抽象类定义对该抽象的接口,而详细的子类则用不同方式加以实现。可是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行改动、扩充和重用。而组合方式能够使得通过抽象部分与实现部分进行独立的改动。

2.2.2结构


Client

   —  Bridge模式的使用者

•Abstraction

— 定义抽象类的接口。

— 维护一个指向Im p l e m e n t o r 类型对象的指针。

•RefinedAbstraction

— 扩充由Ab s t r a c t i o n定义的接口。

•Implementor

— 定义实现类的接口,该接口不一定要与A b s t r a c t i o n的接口全然一致;其实这两个接口能够全然不同。一般来讲, I m p l e m e n t o r接口仅提供基本操作,而 A b s t r a c t i o n则定义了基于这些基本操作的较高层次的操作。

•ConcreteImplementor

— 实现Im p l e m e n t o r 接口并定义它的详细实现。

2.2.3 效果

1)  分离接口及事实上现部分 一个实现未必不变地绑定在一个接口上。抽象类的实现能够在执行时刻进行配置,一个对象甚至能够在执行时刻改变它的实现。

2)  提高可扩充性 你能够独立地对Ab s t r a c t i o n和Im p l e m e n t o r 层次结构进行扩充。

3 ) 实现细节对客户透明 你能够对客户隐藏实现细节,比如共享I m p l e m e n t o r对象以及对应的引用计数机制(假设有的话) 。

2.2.4 样例-C++

代码片断1:Abstraction.h

//Abstraction.h

#ifndef _ABSTRACTION_H_

#define _ABSTRACTION_H_

class AbstractionImp;

class Abstraction

{

public:

virtual ~Abstraction();

virtual voidOperation() = 0;

protected:

Abstraction();

private:

};

class RefinedAbstraction :public
Abstraction

{

public:

RefinedAbstraction(AbstractionImp*

imp);

~RefinedAbstraction();

void Operation();

protected:

private:

AbstractionImp* _imp;

};

#endif //~_ABSTRACTION_H

//Abstraction.cpp

#include"Abstraction.h"

#include"AbstractionImp.h"

#include<iostream>

using namespace std;

Abstraction::Abstraction()

{

}

Abstraction::~Abstraction()

{

}

RefinedAbstraction::RefinedAbstraction(Abstra

ctionImp* imp)

{

_imp = imp;

}

RefinedAbstraction::~RefinedAbstraction()

{

}

void RefinedAbstraction::Operation()

{

_imp->Operation();

}

代码片断3:AbstractionImp.h

//AbstractionImp.h

#ifndef _ABSTRACTIONIMP_H_

#define _ABSTRACTIONIMP_H_

class AbstractionImp

{

public:

virtual ~AbstractionImp();

virtual voidOperation() = 0;

protected:

AbstractionImp();

private:

};

class ConcreteAbstractionImpA :public

AbstractionImp

{

public:

ConcreteAbstractionImpA();

~ConcreteAbstractionImpA();

virtual voidOperation();

protected:

private:

};

class ConcreteAbstractionImpB :public

AbstractionImp

{

public:

ConcreteAbstractionImpB();

~ConcreteAbstractionImpB();

virtual voidOperation();

protected:

private:

};

#endif //~_ABSTRACTIONIMP_H_

代码片断4:AbstractionImp.cpp

//AbstractionImp.cpp

#include"AbstractionImp.h"

#include<iostream>

using namespace std;

AbstractionImp::AbstractionImp()

{

}

AbstractionImp::~AbstractionImp()

{

}

void AbstractionImp::Operation()

{

cout << "AbstractionImp....imp..." << endl;

}

ConcreteAbstractionImpA::ConcreteAbstractio

nImpA()

{

}

ConcreteAbstractionImpA::~ConcreteAbstracti

onImpA()

{

}

void ConcreteAbstractionImpA::Operation()

{

cout << "ConcreteAbstractionImpA...." << e

ndl;

}

ConcreteAbstractionImpB::ConcreteAbstractio

nImpB()

{

}

ConcreteAbstractionImpB::~ConcreteAbstracti

onImpB()

{

}

void ConcreteAbstractionImpB::Operation()

{

cout << "ConcreteAbstractionImpB...." << e

ndl;

}

代码片断5:main.cpp

//main.cpp

#include"Abstraction.h"

#include"AbstractionImp.h"

#include<iostream>

using namespace std;

int main(int argc,
char*argv[])

{

AbstractionImp*imp = new

ConcreteAbstractionImpA();

Abstraction*abs = new

RefinedAbstraction(imp);

abs->Operation();

return 0;

}

2.2.5 样例-JAVA

Implementor类:

1. package com.qianyan.bridge;

2.

3. public interface Engine {

4.

5.     /**

6.      * 安装发动引擎

7.      */

8.     public void installEngine();

9. }

ConcreteImplementor类:

1. package com.qianyan.bridge;

2.

3. public class Engine2000 implements Engine {

4.

5.     @Override

6.     public void installEngine() {

7.         System.out.println("安装2000CC发动引擎");

8.     }

9.

10.}

1. package com.qianyan.bridge;

2.

3. public class Engine2200 implements Engine {

4.

5.     @Override

6.     public void installEngine() {

7.         System.out.println("安装2200CC发动引擎");

8.     }

9.

10.}

Abstraction类:

1. package com.qianyan.bridge;

2.

3. public abstract class Vehicle {

4.

5.     private Engine engine;

6.

7.     public Vehicle(Engine engine) {

8.         this.engine = engine;

9.     }

10.

11.    public Engine getEngine() {

12.        return engine;

13.    }

14.

15.    public void setEngine(Engine engine) {

16.        this.engine = engine;

17.    }

18.

19.    public abstract void installEngine();

20.}

Refined Abstraction类:

1. package com.qianyan.bridge;

2.

3. public class Bus extends Vehicle {

4.

5.     public Bus(Engine engine) {

6.         super(engine);

7.     }

8.

9.     @Override

10.    public void installEngine() {

11.        System.out.print("Bus:");

12.        this.getEngine().installEngine();

13.    }

14.

15.}

 

1. package com.qianyan.bridge;

2.

3. public class Jeep extends Vehicle {

4.

5.     public Jeep(Engine engine) {

6.         super(engine);

7.     }

8.     @Override

9.     public void installEngine() {

10.        System.out.print("Jeep:");

11.        this.getEngine().installEngine();

12.    }

13.

14.}

 

1. package com.qianyan.bridge;

2.

3. public class MainClass {

4.     public static void main(String[] args) {

5.         Engine engine2000 = new Engine2000();

6.         Engine engine2200 = new Engine2200();

7.

8.         Vehicle bus = new Bus(engine2000);

9.         bus.installEngine();

10.

11.        Vehicle jeep = new Jeep(engine2200);

12.        jeep.installEngine();

13.    }

14.}

 

Result:

1. Bus:安装2000CC发动引擎

Jeep:安装2200CC发动引擎

设计模式(7)-结构型模式-Bridge模式的更多相关文章

  1. 【设计模式】结构型03外观模式(Facade Pattern)

    [设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...

  2. 【设计模式】结构型04桥接模式(Bridge Pattern)

    学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...

  3. 【结构型】Bridge模式

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

  4. 【设计模式】结构型05组合模式(Composite Pattern)

    组合模式(Composite Pattern) 意图:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 主要解决:它在我们 ...

  5. 【设计模式】结构型01代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 定义:顾名思义,增加中间层,为其他对象提供一种代理以控制对这个对象的访问.核心在于代理二字. 1.和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理 ...

  6. 【结构型】Flyweight模式

    享元模式的主要目的.意图是为对象的大量使用提供一种共享机制.该模式的思想重在复用.共享复用.像文字.列表中的格子等这类多数都是需要考虑复用技术,否则必将大量耗费内存空间而使资源以及性能等大量耗费.该模 ...

  7. Go语言实现的23种设计模式之结构型模式

    摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...

  8. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  9. python设计模式---结构型之代理模式

    主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...

随机推荐

  1. whatis---查询一个命令执行什么功能

    whatis命令是用于查询一个命令执行什么功能,并将查询结果打印到终端上. whatis命令在用catman -w命令创建的数据库中查找command参数指定的命令.系统调用.库函数或特殊文件名.wh ...

  2. fork函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  3. hdu 1024 最大m子段和

    注:摘的老师写的 最大m子段和问题 以-1 4 -2 3 -2 3为例最大子段和是:6最大2子段和是:4+(3-2+3)=8所以,最大子段和和最大m子段和不一样,不能用比如先求一个最大子段和,从序列中 ...

  4. html5的代码验证

    http://html5.validator.nu/ http://validator.w3.org/#validate_by_uri

  5. Firefox访问https的网站,一直提示不安全

    http://mozilla.com.cn/thread-374897-1-1.html 要激活此功能步骤如下: 在地址栏键入"about:config" 点击“我了解此风险” 在 ...

  6. 2.AngularJS-验证

    转自:https://www.cnblogs.com/best/p/6225621.html 一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属 ...

  7. POJ - 3846 Mountain Road 动归

    POJ - 3846 Mountain Road 题意:n个人要过桥,有的人从左边来,有的人从右边来,给你他们到达桥一端的时间和过桥所需要的时间,要求相向而行的只能有一人,对于每一个点,不能在10s内 ...

  8. Android自定义组件系列【16】——最帅气的自动滚动广告条

    前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用ViewFlipper来实现一个,在此将代码贴出来,与大家共享. 转载请说明出处:http://blog. ...

  9. Multi-process Resource Loading

    For Developers‎ > ‎Design Documents‎ > ‎ Multi-process Resource Loading 目录 1 This design doc n ...

  10. CentOS6.x操作系统自带的 DM Multipath(DMMP)多路径软件配置说明。

    CentOS系统下的多路径软件是操作系统自带的 DM Multipath(DMMP)工具.------------------------------------------------------- ...