酷炫网站,大良营销网站建设资讯,做网站百度还是阿里巴巴好,简单的生产管理系统动机(Motivate): 在软件系统中#xff0c;某些类型由于自身的逻辑#xff0c;它具有两个或多个维度的变化#xff0c;那么如何应对这种“多维度的变化”#xff1f;如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化#xff0c;而又不引入额外的复杂度…动机(Motivate): 在软件系统中某些类型由于自身的逻辑它具有两个或多个维度的变化那么如何应对这种“多维度的变化”如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化而又不引入额外的复杂度 意图(Intent): 将抽象部分与实现部分分离使它们都可以独立的变化。 ------《设计模式》GOF 结构图(Struct): 生活中的例子 我想大家小时候都有用蜡笔画画的经历吧。红红绿绿的蜡笔一大盒根据想象描绘出格式图样。而毛笔下的国画更是工笔写意各展风采。而今天我们的故事从蜡笔与毛笔说起。 设 想要绘制一幅图画蓝天、白云、绿树、小鸟如果画面尺寸很大那么用蜡笔绘制就会遇到点麻烦。毕竟细细的蜡笔要涂出一片蓝天是有些麻烦。如果有可能 最好有套大号蜡笔粗粗的蜡笔很快能涂抹完成。至于色彩吗最好每种颜色来支粗的除了蓝天还有绿地呢。这样如果一套12种颜色的蜡笔我们需要两套 24支同种颜色的一粗一细。呵呵画还没画开始做梦了要是再有一套中号蜡笔就更好了这样不多不少总共36支蜡笔。 再看看毛笔这一边居然如此简陋一套水彩12色外加大中小三支毛笔。你可别小瞧这简陋的组合画蓝天用大毛笔画小鸟用小毛笔各具特色。 呵呵您是不是已经看出来了不错我今天要说的就是Bridge模式。为了一幅画我们需要准备36支型号不同的蜡笔而改用毛笔三支就够了当 然还要搭配上12种颜料。通过Bridge模式我们把乘法运算3×1236改为了加法运算31215这一改进可不小。那么我们这里蜡笔和毛笔到 底有什么区别呢 实际上蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。【GOF95】桥梁模式的用意是将抽象化 (Abstraction)与实现化(Implementation)脱耦使得二者可以独立地变化。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不 开的所以就造成必须使用36支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦各自独立变化便简化了操作。在这里抽象层面的概念是 毛笔用颜料作画而在实现时毛笔有大中小三号颜料有红绿蓝等12种于是便可出现3×12种组合。每个参与者毛笔与颜料都可以在自己的自由度 上随意转换。 蜡笔由于无法将笔与颜色分离造成笔与颜色两个自由度无法单独变化使得只有创建36种对象才能完成任务。Bridge模式将继承关系转换为组合关系从而降低了系统间的耦合减少了代码编写量。 代码实现
1 abstract class Brush2 {3 protected Color c;4 public abstract void Paint();5 6 public void SetColor(Color c)7 { this.c c; }8 }1 class BigBrush : Brush2 {3 public override void Paint()4 { Console.WriteLine(Using big brush and color {0} painting, c.color); }5 }1 class SmallBrush : Brush2 {3 public override void Paint()4 { Console.WriteLine(Using small brush and color {0} painting, c.color); }5 }1 class Color2 {3 public string color;4 }1 class Red : Color2 {3 public Red()4 { this.color red; }5 }1 class Green : Color2 {3 public Green()4 { this.color green; }5 }1 class Blue : Color2 {3 public Blue()4 { this.color blue; }5 }1 class Program 2 { 3 public static void Main() 4 { 5 Brush b new BigBrush(); 6 b.SetColor(new Red()); 7 b.Paint(); 8 b.SetColor(new Blue()); 9 b.Paint();10 b.SetColor(new Green());11 b.Paint();12 13 b new SmallBrush();14 b.SetColor(new Red());15 b.Paint();16 b.SetColor(new Blue());17 b.Paint();18 b.SetColor(new Green());19 b.Paint();20 }适用性 1如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性避免在两个层次之间建立静态的联系。 2设计要求实现化角色的任何改变不应当影响客户端或者说实现化角色的改变对客户端是完全透明的。 3 一个构件有多于一个的抽象化角色和实现化角色系统需要它们之间进行动态耦合。 4 虽然在系统中使用继承是没有问题的但是由于抽象化角色和具体化角色需要独立变化设计要求需要独立管理这两者。Bridge要点 1Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系使得抽象和实现可以沿着各自的维度来变化。 2所谓抽象和实现沿着各自维度的变化即“子类化”它们得到各个子类之后便可以任意它们从而获得不同平台上的不同型号。 3Bridge模式有时候类似于多继承方案但是多继承方案往往违背了类的单一职责原则即一个类只有一个变化的原因复用性比较差。Bridge模式是比多继承方案更好的解决方法。 4Bridge模式的应用一般在“两个非常强的变化维度”有时候即使有两个变化的维度但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果并不一定要使用Bridge模式。