设计模式(7)-结构型模式-Bridge模式

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发动引擎

时间: 2024-08-27 11:26:51

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

【结构型】Bridge模式

桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化.简简单单的一句话,却已经是站在了更高抽象层面上来看待.设计.解决问题.平常我们多是对具体问题进行分析.抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可.这种情况下的结构关系图参考如下: 这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要

&quot;围观&quot;设计模式(15)--结构型之桥梁模式(Bridge Pattern)

桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为.具体特征分离开来,使它们可以各自独立的变化.事物对象仅是一个抽象的概念.如"圆形"."三角形"归于抽象的"形状"之下,而"画圆"."画三角"归于实现行为的"画图"类之下,然后由"形状"调用"画图".----WIKIPEDIA 个人理解 桥梁模式的核心在于解耦,通过抽象化将具体的事物

&quot;围观&quot;设计模式(14)--结构型之外观模式(Facade Pattern)

外观模式(Facade pattern),是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用.----WIKIPEDIA 个人理解 当一个项目中出现比较杂乱的调用关系时,类与类之间的耦合关系过于复杂,为了降低耦合度,我们可以采用一个公共的接口与其他类发生耦合,这样可以尽量大的降低外界与该系统的耦合度,同时降低了整个系统的复杂度,外观模式相当于一个公共的入口一样,为使用者敞开大门,暴漏一些必要的接口,方便外界进行调用.通俗来讲就是,有多个不同的类

&quot;围观&quot;设计模式(12)--结构型之代理模式(Proxy Pattern)

维基百科 代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式. 所谓的代理者是指一个类可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.内存中的大对象.文件或其它昂贵或无法复制的资源.----WIKIPEDIA 个人理解 代理模式就是找另外的一个对象作为代理去为你实施请求,代理模式分为两种,一种是静态代理模式,另外一种是动态代理模式,静态代理模式是代理类为其创建一个对象,将需要代理的类的对象赋予代理类中的该对象,让代理类中该对象去代替需要代理的类的对象去执行一定的

【设计模式】-结构型-7-组合模式

主要角色 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为.在透明式的组合模式中抽象构件还声明访问和管理子类的接口:在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口. 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点.它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 A

【设计模式】-结构型-2-适配器模式

主要角色 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者. 代码展示 package adapter; //目标接口 interface Target { public void request(); } //适配者接口 class Adaptee { public

【设计模式】-结构型-5-外观模式

主要角色 外观(Facade)角色:为多个子系统对外提供一个共同的接口. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它. 客户(Client)角色:通过一个外观角色访问各个子系统的功能. 代码展示 package facade; public class FacadePattern { public static void main(String[] args) { Facade f=new Facade(); f.method(); } } //外观角色

&quot;围观&quot;设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)

设计模式代码下载地址 设计模式代码下载地址 1  适配器模式 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对

设计模式总结-结构型模式

描述: 如何组合类和对象以获得最大的结构: 不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法: 分类: 适配器模式 http://blog.csdn.net/huo065000/article/details/22177651 装饰模式 http://blog.csdn.net/huo065000/article/details/22061403 代理模式 http://blog.csdn.net/huo065000/article/details/22177

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

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺