一、什么是桥接模式
将抽象部分和实现部分分隔开,使都可以独立变化
关键在于分隔变化维度,将不同的维度分隔开,然后组合聚合,抽象与实现脱耦。
UML图
IMplementor:实现功能类之后会与抽象主题组合聚合
ConcreteMplementorA: 具体实现功能类A
Abstraction:抽象类,定义主体
二、适用场景
存在多维度描述对象的情况,可以使用桥接模式,比如 蜡笔可以分为大中小三个号,又分别有赤橙黄绿青蓝紫七种颜色, 这就可以按 尺寸和颜色分两个维度.一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
三、优缺点
优点
抽象与实现分离,
便于扩展维度内容,极大减少子类
缺点
增加锡系统的理解和设计难度,聚合发生在抽象层,需要对抽象层进行编程设计。
需要正确识别出系统中两个独立变化的维度,使用具有局限性。
四、大话中的例子
手机品牌和软件的例子,手机可以分为不同的品牌,手机软件也可以分不同的软件,使用桥接模式,便能方便的解决组合情况过多的情况。手机类抽象出来,华为手机、小米手机; 软件抽象出来, 游戏软件,计算器软件; 手机类持有软件字段,可给字段附上内容。这个变化发生在客户端。
五、我的例子
using System;
using System.Collections.Generic;
namespace BridgePatternMode
{
class Program
{
static void Main(string[] args)
{
Ninjutsu ninjutsu = new LvSNinjutsu("风遁螺旋丸手里剑", new WindAttribute());
ninjutsu.Operation();
ninjutsu = new LvANinjutsu("多重影分身");
ninjutsu.Operation();
ninjutsu = new LvSNinjutsu("魔镜冰晶", new WindAttribute(), new WaterAttribute());
ninjutsu.Operation();
Console.ReadKey();
}
}
abstract class Ninjutsu
{
protected string Lv;
string name;
List<NinjutsuAttribute> attributes;
public Ninjutsu(string name, params NinjutsuAttribute[] attributes)
{
this.name = name;
if (attributes != null)
{
this.attributes = new List<NinjutsuAttribute>();
foreach (var item in attributes)
{
this.attributes.Add(item);
}
}
}
public virtual void Operation()
{
foreach (var item in attributes)
{
item.MyAttribute();
}
Console.WriteLine("{0}级忍术,{1}", Lv, name);
}
}
class LvDNinjutsu : Ninjutsu
{
public LvDNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
{
Lv = "D";
}
}
class LvCNinjutsu : Ninjutsu
{
public LvCNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
{
Lv = "C";
}
}
class LvBNinjutsu : Ninjutsu
{
public LvBNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
{
Lv = "B";
}
}
class LvANinjutsu : Ninjutsu
{
public LvANinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
{
Lv = "A";
}
}
class LvSNinjutsu : Ninjutsu
{
public LvSNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
{
Lv = "S";
}
}
abstract class NinjutsuAttribute
{
public abstract void MyAttribute();
}
class WaterAttribute : NinjutsuAttribute
{
public override void MyAttribute()
{
Console.Write("水属性");
}
}
class FireAttribute : NinjutsuAttribute
{
public override void MyAttribute()
{
Console.Write("火属性");
}
}
class WindAttribute : NinjutsuAttribute
{
public override void MyAttribute()
{
Console.Write("风属性");
}
}
class ThunderAttribute : NinjutsuAttribute
{
public override void MyAttribute()
{
Console.Write("雷属性");
}
}
class SoilAttribute : NinjutsuAttribute
{
public override void MyAttribute()
{
Console.Write("土属性");
}
}
}
运行结果
PS:桥接模式是双维度的最佳展示,只不过 实例的具体确认放在了客户端.