本文共 2470 字,大约阅读时间需要 8 分钟。
将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化。
在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式。
2.1 抽象(Abstraction):定义抽象接口,该接口中包含实现具体行为、具体特征的Implementor接口。
2.2 提炼的抽象(RefinedAbstraction):继承自Abstraction的子类,依旧是一个抽象的事物名。
2.3 实现(Implementor):定义具体行为,具体特征的应用接口。
2.4 具体实现(ConcreteImplementor):实现Implementor。
4.1 实现要点
Bridge模式使用“对象间的组合/聚合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化
抽象化 从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征,就是抽象化。例如:苹果、香蕉、梨、桃子等。它们共同的特征就是水果。得出水果概念的过程,就是一个抽象化的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物分开来的特征,这些具有区分作用的特征�又称为本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。所以抽象化的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度决定于分析问题的目的。 通常情况下,一组对象如果具有相同的特征,那么它们就可以通过一个共同的类来描述。如果一些类具有相同的特征,往往可以通过一个共同的抽象类来描述。 实现化 抽象化给出的具体实现,就是实现化。 一个类的实例就是这个类的实例化,一个具体子类就是它的抽象超类的实例化。 脱耦 所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的脱耦。在这里,脱耦是指将抽象化和实例化之间的耦合解脱开,或者是将它们之间的强关联改成弱关联。 所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;所谓弱关联,就是可以动态确定并且可以在运行时期动态改变的关联。显然,在java语言中,继承关系是强关联,而聚合关系是弱关联。 将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联,因此,桥梁模式中的所谓脱耦,就是指在一个软件系统中的抽象化和实现化之间使用聚合关系,而不是继承关系,从而使两者可以相对对立的变化。 将抽象部分(手机)与它的实现部分(手机软件类)分离,将实现部分抽象成单独的类,使它们都可以独立地变化整个类图看起来像一座桥,所以称为桥接模式
继承是一种强耦合关系,子类的实现与它的父类有非常紧密的依赖关系,父类的任何变化 都会导致子类发生变化,因此继承或者说强耦合关系严重影响了类的灵活性,并最终限制了可复用性
从桥接模式的设计上我们可以看出聚合是一种比继承要弱的关联关系,手机类和软件类都可独立的进行变化,不会互相影响
////// 手机抽象类/// public abstract class Phone{ protected App _app; public App App { get => _app; set => _app = value; } public Phone() { } public Phone(App app) { this._app = app; } public abstract void UseApp(); } ////// 软件抽象类/// public abstract class App{ public abstract void RunApp(); }** public class HUAWEIPhone : Phone{ public HUAWEIPhone(App app) :base(app) { } public override void UseApp() { Console.WriteLine("华为手机"); this.App.RunApp(); } }** public class MIPhone : Phone{ public MIPhone(App app):base(app) { } public override void UseApp() { Console.WriteLine("小米手机"); this.App.RunApp(); } } public class MuSic : App{ public override void RunApp() { Console.WriteLine("网易云音乐为您服务"); } } public class BaiduApp : App{ public override void RunApp() { Console.WriteLine("百度App已经运行"); } }////// 桥接模式/// class Program{ static void Main(string[] args) { App app=new MuSic(); Phone phone=new HUAWEIPhone(app); phone.UseApp(); Console.ReadKey(); } }
转载地址:http://cdrxo.baihongyu.com/