linzhang wang dept. of computer sci&tech, nanjing university the bridge pattern

26
Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Upload: bethanie-daniel

Post on 18-Dec-2015

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Linzhang Wang

Dept. of Computer Sci&Tech,

Nanjing University

The Bridge Pattern

Page 2: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Intent

Decouple an abstraction from its implementation so that the two can vary independently.

Also Know AS Handle/Body

Page 3: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Motivation

When an abstraction can have one of several possible implementations, the usual way to accommodate them is to use inheritance.

Inheritance binds an implementation to the abstraction permanently, which makes it difficult to modify, extend and reuse abstractions and implementations independently.

Page 4: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Motivation(2)

Consider the implementation of a portable Window abstraction in a user interface toolkit. Using inheritance has two drawbacks: It’s inconvenient to extend the Window abstraction

to cover different kinds of windows or new platforms.

It makes client code platform-dependent.

Page 5: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Motivation(3)

The Bridge pattern addresses these problems by putting the Window abstraction and its implementation in separate class hierarchies. There is one class hierarchy for Window interface. and a separate hierarchy for platform-specific

window implementations, with WindowImp as its root.

Page 6: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Motivation(4)

All operations on Window subclasses are implemented in terms of abstract operations from the WindowImp interface.

This decouples the window abstractions from the various platform-specific implementations.

We refer to the relationship between Window and WindowImp as a Bridge.

Page 7: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Applicability

Use the Bridge pattern when you want to avoid a permanent binding between an

abstraction and its implementation. both the abstractions and their implementations

should be extensible by subclassing. changes in the implementation of an abstraction

should have no impact on clients. You want to hide the implementation of an

abstraction completely from clients.

Page 8: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Applicability(2)

Use the Bridge pattern when(2) you have a proliferation of classes as shown earlier

in the first Motivation diagram. You want to share an implementation among

multiple objects, and this fact should be hidden from the client.

Page 9: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Structure

bridge structure diagram

Abstraction

Operation()

RefinedAbstraction

Implementor

OperationImp()

ConcreteImplementorAOperationImp()

ConcreteImplementorBOperationImp()

Page 10: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Participants

Abstraction (Window) defines the abstraction’s interface. maintains a reference to an object of type

Implementor RefinedAbstraction

Extends the interface defined by Abstraction

Page 11: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Participants(2)

Implementor (WindowImp) defines the interface for implementation classes. This interface doesn’t have to correspond exactly to

Abstraction’s interface. Typically the Implementor interface provides only

primitive operations, and Abstraction defines higher-level operations based on these primitives.

ConcreteImplementor implements the Implementor interface and defines

its concrete implementation.

Page 12: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Collaborations

Abstraction forwards client requests to its Implementor object.

Page 13: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Consequences(1)

Decoupling interface and implementation An implementation is not bound permanently to an

interface. Decoupling Abstraction and Implementor also

eliminates compile-time dependencies on the implementation.

This decoupling encourages layering that can lead to a better-structured system.

Page 14: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Consequences(2)

Improved extensibility. You can extend the Abstraction and Implementor

hierarchies independently. Hiding implementation details from clients

You can shield clients from implementation details.

Page 15: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Implementation(1)

Only one Implementor. An abstract Implementor class isn’t necessary. (A

degenerate case of the Bridge pattern). The separation is still useful when a change in the

implementation of a class must not affect its existing clients.

In C++, the class interface of the Implementor class can be defined in a private header file. This lets you hide an implementation of a class completely from its clients.

Page 16: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Implementation(2)

Creating the right Implementor object How, when, and where do you decide which

Implementor class to instantiate when there’s more than one?

If Abstraction knows about all ConcreteImplementor classes, it can instantiate one of them in its constructor according to the parameter.

Another approach: choose a default and changes it later.

It also possible to delegate the decision to antoher object altogether.

Page 17: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Implementation(3)

Sharing implementors Using a reference count. The sample code.

Handles& Handle::operator= (const Handle& other){

other._body->Ref();_body->Unref();if(_body->RefCount() == 0) {delete _body;}_body = other._body;return *this;

}

Page 18: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Implementation(4)

Using multiple inheritance You can use multiple inheritance in C++ to combine

an interface with its implementation. A class can inherit publicly from Abstraction and privately from a ConcreteImplementor.

But it binds an implementation permanently to its interface.

Page 19: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

class Window {public window(View * contents);

virtual void DrawContents();virtual void open();virtual void close();virtual void Iconify();virtual void DrawLine();virtual void DrawRect();…

}

Page 20: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

class WindowImp{

public:

virtual void ImpTop() = 0;

virtual void ImpBottom() = 0;

virtual void ImpSetExtent(const Point&) = 0;

virtual void ImpSetOrigin(const Point&) = 0;

}

Page 21: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

Subclasss of Window define the different kinds of windows.class ApplicationWindow : public Window {

public:

virtual void DrawContents();

}

void ApplicationWindow::DrawContents(){

GetView()->DrawOn(this);

}

Page 22: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

class IconWindow : public Window {

public:

virtual void DrawContents();

private:

const char * _bitmapName;

}

void IconWindow::DrawContents(){

WindowImp* imp = GetWindowImp();

if(imp != 0)

imp->DeviceBitmap(…);

}

Page 23: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

Window operations are defined in terms of the WindowImp interface:void Window::DrawRect(const Point& p1,

const Point& p2)

{

WindowImp *imp = GetWindowImp();

imp->DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y());

}

Page 24: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

class XWindowImp: public WindowImp{

public:

XWindowImp();

virtual voidDeviceRect(coord, Coord, Coord, Coord);

private:

}

Page 25: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Sample Code

WindowImp * Window::GetWindowImp()

{

if(_imp == 0) {

_imp = WindowSystemFactory::Instance()->MakeWindowImp();

}

return _imp;

}

Page 26: Linzhang Wang Dept. of Computer Sci&Tech, Nanjing University The Bridge Pattern

Related Patterns

Abstract Factory can create and configure a particular Bridge.

The Adapter(139) patterns is geared toward making unrelated classes work together.