这两天忙着考试都没来得及更新。。(懒的借口吧~~~)今天学习的是桥接模式~~
桥接模式(Bridge Pattern)
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
意图:
将抽象部分与实现部分分离,使它们都可以独立的变化。
角色:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
类图:
实例代码(大话设计模式手机品牌与软件一例):
abstract class HandsetSoft
{
public abstract void Run();
}
abstract class HandsetBrand
{
protected HandsetSoft soft;
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
public abstract void Run();
}
class HandsetGame : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机游戏-----");
}
}
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机通讯录-------");
}
}
class HandsetMP3 : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行MP3播放器------");
}
}
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
Console.WriteLine("在手机品牌M上");
soft.Run();
}
}
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
Console.WriteLine("在手机品牌N上");
soft.Run();
}
}
class Program
{
static void Main(string[] args)
{
HandsetBrand hb = new HandsetBrandM();
hb.SetHandsetSoft(new HandsetGame());
hb.Run();
hb=new HandsetBrandN();
hb.SetHandsetSoft(new HandsetAddressList());
hb.Run();
hb.SetHandsetSoft(new HandsetMP3());
hb.Run();
Console.ReadKey();
}
}
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。