先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让model独立出来就可以上蹿下跳^_^
现在看来,这句话,前半句是对的,后半句,有点牵强。
具体实现方式(举例场景:每种手机可以装多个操作系统):
1、将可变的地方抽象为接口,并将可变的情况继承自接口并实现
public interface ISystem { string System(); }
public class IOSSystem : ISystem { public string System() { return "IOS"; } }
2、定义一个基类,将可变的地方使用接口申明为属性
public abstract class BasePhone { public ISystem CurrentSystem = null;//可变的地方//public abstract string System(); public abstract void Call(); public abstract void Message(); }
3、将具体的实现类继承自基类
public class Lumia : BasePhone { public override void Call() { Console.WriteLine("使用{0} {1}打电话", this.GetType(), CurrentSystem.System()); } public override void Message() { Console.WriteLine("使用{0} {1}发短信", this.GetType(), CurrentSystem.System()); } }
4、在使用时,根据情况,将可变属性赋值
BasePhone lumia = new Lumia(); lumia.CurrentSystem = new IOSSystem(); lumia.Message(); lumia.Call();
桥接模式的使用场景,当类和行为呈现m*n的代码爆炸情况时,在基类中使用接口封装变化点,在使用时,根据情况组合。增加程序的扩展性,使变化点具有扩展性。
为什么要有基类呢?我觉得是为了约束类的不变因素。