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):
Abstraction通过Implementor对象的引用,转发来自Client的请求
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
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.
2.RajeshV.S.,BridgePatternsinC#,
3.Airhand,各种语言多态性比较,
相关文章推荐
- Bridge Pattern using C#
- Proxy Pattern using C# (转载)
- Proxy Pattern using C#
- C#设计模式之七桥接模式(Bridge Pattern)【结构型】
- 【转载】C#中Using 的几种用法
- C#设计模式之七桥接模式(Bridge Pattern)【结构型】
- Using C# 2.0 Generics to achieve a reusable Singleton pattern
- (转载的)C#using的用法
- Implementing the Singleton Pattern in C#[转载]
- (转载的)C#using的用法
- C#设计模式-1、适配器模式(Adapter Pattern)(转载)
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
- Design Pattern Framework 4.0 C# 之三 Bridge
- C#设计模式——桥接模式(Bridge Pattern)
- Introduction to Model View Control (MVC) Pattern using C#
- C#设计模式(八)桥接模式(Bridge Pattern)
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
- C#设计模式之桥接模式(Bridge Pattern)
- C#设计模式(8)——桥接模式(Bridge Pattern)