桥接模式:
抽象部分与它的实现部分分离,都可以独立变化。
桥接就是为被分离了的 抽象部分Abstraction 和 实现部分Implementor 来搭桥,比如下面要介绍的手机软件和手机品牌之间搭个桥,手机品牌包含有手机软件,但是手机软件并不是手机品牌的一部分,他们这间是聚合的关系,这也说明在桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用具体实现部分的对象,而不能反过来,也就是个单向桥。
搭个桥,让抽象部分拥有实现部分的接口对象,这样只要在抽象部分就可以通过这个接口来调用具体实现部分的功能。也就是说,桥接在程序上就体现为在抽象部分拥有实现部分的接口对象,维护桥接就是维护这个关系。
结构图:
实现:
抽象类、派生类实现自己的对象,将实现独立出来、抽象和实现可以沿着各自的维度来变化。需要多角度分类实现对象时,只用继承会增加大量的类时,应该考虑使用桥接模式把这种多角度分离出来让他们独立变化。
(该段可省略不看:有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。桥接模式是比多继承方案更好的解决方法。)
代码:
class Program
{
static void Main(string[] args)
{
//HandsetBrandN / HandsetBrandM / HandsetSoft /HandsetAddressList各种独立,互不影响
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();
}
}
abstract class HandsetSoft//手机类
{
public abstract void Run();
}
class HandsetGame:HandsetSoft//手机游戏
{
public override void Run()
{
Console.WriteLine("\n运行手机游戏");
}
}
class HandsetAddressList:HandsetSoft//手机通讯录
{
public override void Run()
{
Console.WriteLine("\n运行手机通讯录");
}
}
abstract class HandsetBrand
{
protected HandsetSoft soft;
//设置手机软件
//可在机器中安装软件,以备运行
public void setHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
//运行
public abstract void Run();
}
//手机品牌N
class HandsetBrandN :HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
class HandsetBrandM:HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
}
</pre><pre>
与策略模式:
与装饰模式:
装饰模式动态地给对象添加额外的职责,比生成子类更灵活。装饰功能放在单独的类中,每个类只需关心自己的功能,有种互补的意味,将类中的装饰功能从类中搬移去除,去除了重复的装饰逻辑。
桥接模式关键在于接口对象,减少各类间的耦合;各类间没有什么太多的关系。
桥接模式(Bridge)用途:
适用在需要跨多平台的图形和窗口系统。
当需要用不同的方式改变接口和实现时。……额、不太懂;
大概有多种实现方式时用桥接模式,越解释越混乱,就这样……
thanks for your time