桥接模式
定义:
将抽象部分与它的实现部分分离,,使它们都可以独立地变化。
抽象化:
存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。
实现化:
抽象化给出的具体实现,就是实现化。
结构:
抽象化角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化角色:这个角色给出实现化角色接口的具体实现。
适用性:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
结构图:
实例:手机软件
结构图:
代码:
手机软件抽象类:
//手机软件抽象类
abstract class HandsetSoft
{
public abstract void Run();
}
//游戏,通讯录等类:
//游戏,通讯录等类
class HandsetGame : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机游戏");
}
}
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机通讯录");
}
}
手机品牌:
//手机品牌
abstract class HandsetBrand
{
protected HandsetSoft soft;
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
public abstract void Run();
}
品牌N和品牌M具体类:
//品牌N和品牌M具体类
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
客户端代码:
static void Main(string[] args)
{
HandsetBrand ab;
ab = new HandsetBrandN();
ab.SetHandsetSoft(new HandsetGame());
ab.Run();
ab.SetHandsetSoft(new HandsetAddressList());
ab.Run();
ab = new HandsetBrandM();
ab.SetHandsetSoft(new HandsetGame());
ab.Run();
ab.SetHandsetSoft(new HandsetAddressList());
ab.Run();
Console.Read();
}
结果:
桥接模式中的“将抽象部分与它的实现部分分离”,是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。实现指的是抽象类和它的派生类用来实现自己的对象。桥接模式分离了抽象部分和实现部分,从而极大地提高了系统的灵活性,提高了系统的可扩展性,实现运行期间动态地切换。