简介
桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化。桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。
书中实例
时间过的可真快,想想几年前手机游戏还不是Android和Ios两种下载方式呢,只有同一厂家的手机才能玩同一款游戏,小菜和大鸟就赶在了这个时候。小菜想玩大鸟手机里的游戏,结果小菜就又学新模式了——桥接模式。
桥接模式实现程序
//手机品牌类
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("运行手机游戏");
}
}
//手机品牌N的游戏
class HandsetBrandNGame : HandsetBrandN
{
public override void Run()
{
Console.WriteLine("运行M品牌手机游戏");
}
}
//手机品牌M的游戏
class HandsetBrandMGame : HandsetBrandM
{
public override void Run()
{
Console.WriteLine("运行M品牌手机游戏");
}
}
//手机品牌N
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
//手机品牌M
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
//手机软件
abstract class HandsetSoft
{
public abstract void Run();
}
//手机通讯录类
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机通讯录");
}
}
//手机品牌M的通讯录
class HandsetBrandMAddressList : HandsetBrandM
{
public override void Run()
{
Console.WriteLine("运行M品牌手机通讯录");
}
}
//手机品牌N的通讯录
class HandsetBrandNAddressList : HandsetBrandN
{
public override void Run()
{
Console.WriteLine("运行N品牌手机通讯录");
}
}
//客户端
class Program
{
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();
}
}
组成类图
关系介绍
实现者类(Implementor)下属有N个具体实现者子类(ConcreteImplementor),它们负责实现实现者类。抽象类(Abstraction)是被提炼抽象类(RefinedAbstraction)的父类。抽象类和实现者类之间为聚合关系,实现者类拥有抽象类。
桥接模式的构成
Implementor(实现者类):这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
ConcreteImplementor(具体实现者类):具体实现者子类。
Abstraction(抽象类):抽象化给出的定义,并保存一个对实现化对象的引用。
RefinedAbstraction(提炼抽象类):扩展抽象化角色,改变和修正父类对抽象化的定义。
桥接模式的优点
1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
3、实现细节对客户透明,可以对用户隐藏实现细节。
使用场景
1.在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化。桥接模式可以应对这种多维度变化。