动机:ThinkPad有多个型号,如T43,T60,每个型号都支持多种工作模式。每个型号在不同的模式下有些操作实现不同。随着不断发展,其型号越来越多,工作模式也越来越多。如何把ThinkPad沿着型号和工作模式两个方向的变化分离,使它们独立变化,而不引入额外的复杂度(由基类不断继承以产生不同型号ThinkPad上不同工作模式所带来的复杂性)?
应用:适应对象的多维度变化
结构
代码实现
要点:
1、本模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象(ThinkPad型号)和实现(工作模式)可以沿着各自的维度来变化。
2、所谓抽象和实现沿着各自的维度变化,即“子类化”它们(比如不同的ThinkPad子类,不同的工作模式子类)。得到各个子类之后,就可以任意组合ThinkPad型号和工作模式,从而得到不同型号、工作模式的ThinkPad。
3、本模式有时候类似于多集成方案,但是多继承方案往往违背类单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式更好。
4、本模式一般应用于对象面临两个非常强维度的变化,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——两个维度的变化不会产生纵横交错的结果,并不一定要使用此模式。
应用:适应对象的多维度变化
结构
代码实现
namespace DesignPattern.Bridge
{
public abstract class ThinkPad
{
// 通过不同型号ThinkPad对象组合在不同工作模式下实现相关操作的对象,把同一对象在不同模式下相关操作的变化转移到该不同模式实现操作对象中,同时也为实现不同对象和不同模式的任意组合提供支持。
protected ThinkPadModeImp thinkPadModeImp;
public ThinkPad(ThinkPadModeImp thinkPadModeImp)
{
this.thinkPadModeImp = thinkPadModeImp;
}
public abstract void Start();
public abstract void Operate();
public abstract void ShutDown();
}
public class T43 : ThinkPad
{
public T43(ThinkPadModeImp thinkPadModeImp)
: base(thinkPadModeImp)
{
}
public override void Operate()
{
thinkPadModeImp.Operate1();
thinkPadModeImp.Operate2();
// Do something else
}
public override void Start()
{
}
public override void ShutDown()
{
}
}
public class T60 : ThinkPad
{
public T60(ThinkPadModeImp thinkPadModeImp)
: base(thinkPadModeImp)
{
}
public override void Operate()
{
thinkPadModeImp.Operate1();
thinkPadModeImp.Operate2();
// Do something else
}
public override void Start()
{
}
public override void ShutDown()
{
}
}
}
{
public abstract class ThinkPad
{
// 通过不同型号ThinkPad对象组合在不同工作模式下实现相关操作的对象,把同一对象在不同模式下相关操作的变化转移到该不同模式实现操作对象中,同时也为实现不同对象和不同模式的任意组合提供支持。
protected ThinkPadModeImp thinkPadModeImp;
public ThinkPad(ThinkPadModeImp thinkPadModeImp)
{
this.thinkPadModeImp = thinkPadModeImp;
}
public abstract void Start();
public abstract void Operate();
public abstract void ShutDown();
}
public class T43 : ThinkPad
{
public T43(ThinkPadModeImp thinkPadModeImp)
: base(thinkPadModeImp)
{
}
public override void Operate()
{
thinkPadModeImp.Operate1();
thinkPadModeImp.Operate2();
// Do something else
}
public override void Start()
{
}
public override void ShutDown()
{
}
}
public class T60 : ThinkPad
{
public T60(ThinkPadModeImp thinkPadModeImp)
: base(thinkPadModeImp)
{
}
public override void Operate()
{
thinkPadModeImp.Operate1();
thinkPadModeImp.Operate2();
// Do something else
}
public override void Start()
{
}
public override void ShutDown()
{
}
}
}
/*
* ThinkPad多模式下不同操作实现
*/
namespace DesignPattern.Bridge
{
public abstract class ThinkPadModeImp
{
public abstract void Operate1();
public abstract void Operate2();
}
public class ThinkPadMode1Imp : ThinkPadModeImp
{
public override void Operate1()
{
}
public override void Operate2()
{
}
}
public class ThinkPadMostMode2Imp : ThinkPadModeImp
{
public override void Operate1()
{
}
public override void Operate2()
{
}
}
}
* ThinkPad多模式下不同操作实现
*/
namespace DesignPattern.Bridge
{
public abstract class ThinkPadModeImp
{
public abstract void Operate1();
public abstract void Operate2();
}
public class ThinkPadMode1Imp : ThinkPadModeImp
{
public override void Operate1()
{
}
public override void Operate2()
{
}
}
public class ThinkPadMostMode2Imp : ThinkPadModeImp
{
public override void Operate1()
{
}
public override void Operate2()
{
}
}
}
namespace DesignPattern.Bridge
{
public class ThinkPadClient
{
public void Operate()
{
// 此处可根据需要应用创建型模式产生对象
ThinkPadMode1Imp thinkPadMode1Imp = new ThinkPadMode1Imp();
T60 t60 = new T60(thinkPadMode1Imp);
}
}
}
{
public class ThinkPadClient
{
public void Operate()
{
// 此处可根据需要应用创建型模式产生对象
ThinkPadMode1Imp thinkPadMode1Imp = new ThinkPadMode1Imp();
T60 t60 = new T60(thinkPadMode1Imp);
}
}
}
要点:
1、本模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象(ThinkPad型号)和实现(工作模式)可以沿着各自的维度来变化。
2、所谓抽象和实现沿着各自的维度变化,即“子类化”它们(比如不同的ThinkPad子类,不同的工作模式子类)。得到各个子类之后,就可以任意组合ThinkPad型号和工作模式,从而得到不同型号、工作模式的ThinkPad。
3、本模式有时候类似于多集成方案,但是多继承方案往往违背类单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式更好。
4、本模式一般应用于对象面临两个非常强维度的变化,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——两个维度的变化不会产生纵横交错的结果,并不一定要使用此模式。
欢迎光临我的淘宝http://shop35795100.taobao.com,专营游戏点卡、电话卡及各类充值卡。