设计模式之桥接bridge
http://www.cnblogs.com/libingql/p/3496075.html
桥接模式应用分析
桥接模式可以适用于以下情形:
◊ 不希望在抽象与实现部分之间有固定的绑定关系;
◊ 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充;
◊ 对抽象的实现部分进行修改应对客户不产生影响,即客户的代码不必重新编译;
◊ 想对客户完全隐藏抽象的实现部分;
◊ 想在多个对象间共享实现,但同时要求客户并不知道这点。
桥接模式具有以下特点:
◊ 分离接口及其实现部分,一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现;
◊ 将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性;当改变一个实现类时,并不需要重新编译Abstraction类和Client类。
为了保证一个类库的不同版本之间的兼容,需要有这个特性;
◊ 接口与实现分离有助于分层,从而产生更好的结构化系统。系统的高层部分仅需要知道Abstraction和Implementor即可;
◊ 提高可扩充性。可以独立的对Abstraction和Implementor层次结构进行扩充;
◊ 实现细节对Client透明。可以对Client隐藏实现细节,如共享Implementor对象以及相应的引用计数机制
以一杯咖啡为例,子类有四个:中杯加奶、大杯加奶、中杯不加奶、大杯不加奶。
这四个类实际是两个角色的组合:抽象和行为。其中抽象为中杯和大杯,行为为加奶和不加奶。
这种从分离抽象和行为的角度的方法称为桥接模式。
===============================================================
public class BridgeMode
{
public BridgeMode()
{
MakeCofeSingleton milkcafe = new MakeCofeSingleton(new MilkCafe());
MiddleCofe middleCofe = new MiddleCofe();
middleCofe.Make();
MakeCofeSingleton blackcafe = new MakeCofeSingleton(new BlackCafe());
LargeCafe largeCofe = new LargeCafe();
largeCofe.Make();
}
}
public class MakeCofeSingleton {
private static MakeCofe _instance;
public MakeCofeSingleton(MakeCofe instance)
{
_instance = instance;
}
public static MakeCofe Instance()
{
return _instance;
}
}
/// <summary>
/// 做咖啡
/// </summary>
public abstract class MakeCofe {
public abstract void Making();
}
public abstract class Cafe {
private MakeCofe cafe;
public Cafe() {
cafe = MakeCofeSingleton.Instance();
}
public MakeCofe MakeCafe()
{
return this.cafe;
}
public abstract void Make();
}
public class MiddleCofe : Cafe
{
public override void Make()
{
MakeCofe makeCoffee = this.MakeCafe();
Console.Write("中杯");
makeCoffee.Making();
}
}
public class LargeCafe : Cafe {
public override void Make()
{
MakeCofe makeCoffee = this.MakeCafe();
Console.Write("大杯");
makeCoffee.Making();
}
}
/// <summary>
/// 原味咖啡
/// </summary>
public class BlackCafe : MakeCofe
{
public override void Making()
{
Console.WriteLine("原味咖啡");
}
}
/// <summary>
/// 牛奶咖啡
/// </summary>
public class MilkCafe : MakeCofe
{
public override void Making()
{
Console.WriteLine("牛奶咖啡");
}
}
浙公网安备 33010602011771号