您的位置:首页 > 编程语言 > C#

Bridge Pattern using C#(转载)

2006-04-06 15:18 134 查看
BridgePattern(桥接模式)属于StructuralPattern(结构型模式),BridgePattern-将类的接口和它的实现分离,无需修改客户端代码就可以改变或替换实现过程。

Thispatternisusedfordecouplinganabstractionfromitsimplementationsothatthetwocanveryindependently.Thebridgepatternletstheabstractionanditsimplementationevolveseparately.

1.UMLclassdiagram



参与者:

Abstraction:定义类的接口,同时保留一个对Implementor接口类型的引用。

RefinedAbstraction:扩展并实现由Abstraction定义的接口。

Implementor:定义实现类的接口。Implementor接口不必完全符合Abstraction接口,事实上,两个接口可以完全不一致。典型情况下,Implementator接口仅提供简单的方法(primitiveoperations),而Abstraction接口基于这些简单的方法(primitiveoperations)定义更高层次(higher-level)的方法。

ContreteImplementor:实现类,实现Implementor接口。

对上述UML图说明:

Client通过Abstraction接口来交互,也就是说,Client直接通过Abstraction对象来发送请求,Client只需要了解的唯一接口。Abstraction对象也保留一个Implementor对象的引用。模式中对象之间的协作关系:Abstraction通过Implementor对象的引用,转发来自Client的请求到实际对象ConcreteImplementor。

RefinedAbstract是对Abstract接口的扩展和实现(显然,Client无法通过Abstraction接口来生成Abstraction实例对象,而只能通过RefinedAbstraction类来实现)。

Implementor是实现类的接口,所有ConcreteImplementor实现类均实现该接口。

显然,Client调用的Abstraction接口和Implementor或ConcreteImplementor实现了分离,这样Abstraction抽象接口和实现部分可以独立发展。

2.Samplecode

上述UMLclassdiagram的实现代码(fromreference1):

using
System;

//Abstraction
接口-不一定是真正的接口
interface
或抽象类(其实,这里也可以定义
abstract
抽象类,并要相应修改
virtual
publicvoidOperation()
方法)

class
Abstraction

{


//
保留对
Implementor
类型的引用

protected
Implementorimplementor;


public
ImplementorImplementor

{

set
{implementor=value;}

}

//
正是通过
Implementor
的引用来完成对
ConcreteImplementor
的调用

virtual
publicvoidOperation()

{

implementor.Operation();

}

}


//
Implementor
接口或抽象类

abstract
classImplementor

{

//Methods

abstract
publicvoidOperation();

}


//RefinedAbstraction
实现类,
Client
用来创建
Abstraction
对象实例

class
RefinedAbstraction:Abstraction

{

//Methods

override
publicvoidOperation()

{

implementor.Operation();

}

}


//ConcreteImplementorA
具体实现,继承
Implementor
接口或抽象类

class
ConcreteImplementorA:Implementor

{

//Methods

override
publicvoidOperation()

{

Console.WriteLine("ConcreteImplementorAOperation");

}

}


//ConcreteImplementorB
具体实现,继承
Implementor
接口或抽象类

class
ConcreteImplementorB:Implementor

{

//Methods

override
publicvoidOperation()

{

Console.WriteLine("ConcreteImplementorBOperation");

}

}


///
<summary>

///
Clienttest

///
</summary>

public
classClient

{

public
staticvoidMain(string[]args)

{

Abstractionabstraction=newRefinedAbstraction();


//Setimplementationandcall

abstraction.Implementor=newConcreteImplementorA();

abstraction.Operation();


//Changeimplementionandcall

abstraction.Implementor=newConcreteImplementorB();

abstraction.Operation();

}

}


Abstraction通过Implementor对象的引用,转发来自Client的请求
Operation
到实际对象ConcreteImplementor。

3.Appendixaboutthearticle

温故而知新,运用于无形。

【虚函数】

在父类中用virtual声明函数,并实现函数的定义;

publicvirtualboolSQLExe(boolb)

{

returntrue;

}

在子类中用override覆盖此函数,可以实现动态联编。

【纯虚函数】

用关键字abstract声明的函数,并且不实现函数的定义,必须存在于抽象类中。

publicabstractboolf();

在子类中用override覆盖此函数。

【抽象类】

用abstract声明,父类中可包含虚函数声明,并不实现虚函数的定义,只能作为基类。

publicabstractclasscl

{

publiccl(){}

publicabstractboolf();

}

References:

1.http://www.dofactory.com/Patterns/PatternBridge.aspx

2.RajeshV.S.,BridgePatternsinC#,http://www.c-sharpcorner.com/Language/BridgePatternsinCSRVS.asp

3.Airhand,各种语言多态性比较,http://blog.csdn.net/airhand/archive/2004/10/28/156167.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: