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

2014-11-23 22:58:55 · 作者: · 浏览: 0

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 类型对象的指针。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+P1JlZmluZWRBYnN0cmFjdGlvbiA8L3A+CjxwPiAgICAgICAgICAgICAgICChqiDAqbPk08lBYiBzIHQgciBhIGMgdCBpIG8gbrao0uW1xL3Tv9qhozwvcD4KPHA+P0ltcGxlbWVudG9yIDwvcD4KPHA+ICAgICAgICAgICAgICAgIKGqILao0uXKtc/WwOC1xL3Tv9qjrLjDvdO/2rK70ru2qNKq0+tBIGIgcyB0IHIgYSBjIHQgaSBvIG61xL3Tv9rN6sir0rvWwqO7ysLKtcnP1eLBvbj2vdO/2r/J0tTN6sirsrvNrKGj0ruw48C0vbKjrCBJIG0gcCBsIGUgbSBlIG4gdCBvIHK907/avfbM4bmpu/mxvrLZ1/ejrLb4IEEgYiBzIHQgciBhIGMgdCBpIG8gbtTytqjS5cHLu/nT2tXi0Km7+bG+stnX97XEvc+437LjtM61xLLZ1/ehozwvcD4KPHA+P0NvbmNyZXRlSW1wbGVtZW50b3IgPC9wPgo8cD4gICAgICAgICAgICAgICAgoaogyrXP1kltIHAgbCBlIG0gZSBuIHQgbyByIL3Tv9qyorao0uXL/LXEvt/M5cq1z9ahozwvcD4KPGgzPjIuMi4zINCnufs8L2gzPgo8cD4xKSAgt9bA673Tv9q8sMbkyrXP1rK/t9Yg0ru49sq1z9bOtLHYsrux5LXYsPO2qNTa0ru49r3Tv9rJz6Gjs+nP88DgtcTKtc/Wv8nS1NTa1MvQ0Mqxv8y9+NDQxeTWw6Os0ru49rbUz/PJ9dbBv8nS1NTa1MvQ0Mqxv8y4xLHky/y1xMq1z9ahozwvcD4KPHA+MikgIMzhuN+/ycCps+TQ1CDE47/J0tS2wMGitdi21EFiIHMgdCByIGEgYyB0IGkgbyBuus1JbSBwIGwgZSBtIGUgbiB0IG8gciCy47TOveG5ub340NDAqbPkoaM8L3A+CjxwPjMgKSDKtc/Wz7i92rbUv827p824w/cgxOO/ydLUttS/zbun0v6y2Mq1z9bPuL3ao6zA/cjnubLP7UkgbSBwIGwgZSBtIGUgbiB0IG8gcrbUz/PS1Lywz+DTprXE0v3Tw7zGyv27+tbGo6jI57n709C1xLuwo6kgoaM8L3A+CjxoMz4yLjIuNCDA/dfTLUMmIzQzOyYjNDM7PC9oMz4KPHA+tPrC68asts8xo7pBYnN0cmFjdGlvbi5oPC9wPgo8cD4vL0Fic3RyYWN0aW9uLmg8L3A+CjxwPiNpZm5kZWYgX0FCU1RSQUNUSU9OX0hfPC9wPgo8cD4jZGVmaW5lIF9BQlNUUkFDVElPTl9IXzwvcD4KPHA+Y2xhc3MgQWJzdHJhY3Rpb25JbXA7PC9wPgo8cD5jbGFzcyBBYnN0cmFjdGlvbjwvcD4KPHA+ezwvcD4KPHA+cHVibGljOjwvcD4KPHA+ICAgICAgIHZpcnR1YWwgfkFic3RyYWN0aW9uKCk7PC9wPgo8cD4gICAgICAgdmlydHVhbCB2b2lkT3BlcmF0aW9uKCkgPSAwOzwvcD4KPHA+cHJvdGVjdGVkOjwvcD4KPHA+ICAgICAgIEFic3RyYWN0aW9uKCk7PC9wPgo8cD5wcml2YXRlOjwvcD4KPHA+fTs8L3A+CjxwPmNsYXNzIFJlZmluZWRBYnN0cmFjdGlvbiA6cHVibGljCkFic3RyYWN0aW9uPC9wPgo8cD57PC9wPgo8cD5wdWJsaWM6PC9wPgo8cD4gICAgICAgUmVmaW5lZEFic3RyYWN0aW9uKEFic3RyYWN0aW9uSW1wKjwvcD4KPHA+ICAgICAgICAgICAgICBpbXApOzwvcD4KPHA+ICAgICAgIH5SZWZpbmVkQWJzdHJhY3Rpb24oKTs8L3A+CjxwPiAgICAgICB2b2lkIE9wZXJhdGlvbigpOzwvcD4KPHA+cHJvdGVjdGVkOjwvcD4KPHA+cHJpdmF0ZTo8L3A+CjxwPiAgICAgICBBYnN0cmFjdGlvbkltcCogX2ltcDs8L3A+CjxwPn07PC9wPgo8cD4jZW5kaWYgLy9+X0FCU1RSQUNUSU9OX0g8L3A+CjxwPiA8L3A+CjxwPi8vQWJzdHJhY3Rpb24uY3BwPC9wPgo8cD4jaW5jbHVkZQ=="Abstraction.h"

#include"AbstractionImp.h"

#include

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

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

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