zoukankan      html  css  js  c++  java
  • Bridge Pattern简单随笔

                

             Bridge模式就是把抽象部分和它的实现部分分离开来,让两者可独立变化。这里的抽象部分指的是一个概念层次上的东西,它的实现部分指的是实现这个东西的(功能)部分,分离就把实现部分从它要实现的抽象部分独立出来,自我封装成对象。
         

             桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
           

            Bridge模式很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则,理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。。Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

            开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的。

        关于开放封闭原则,其核心的思想是:

        软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

       因此,开放封闭原则主要体现在两个方面:

       对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

       对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

    桥梁模式的用意

    桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。

    抽象化

    存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。

    实现化

    抽象化给出的具体实现,就是实现化。

    脱耦

    所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。


    二、 桥梁模式的结构

    下图所示就是一个实现了桥梁模式的示意性系统的结构图。

    可以看出,这个系统含有两个等级结构,也就是:

    • 由抽象化角色和修正抽象化角色组成的抽象化等级结构。
    • 由实现化角色和两个具体实现化角色所组成的实现化等级结构。

    抽象化角色为设计的重点,采用组合模式来解耦强关联:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace BridgePatternSam
     6 {
     7     public abstract class Operater
     8     {
     9         //对象组合进行操作  关键点
    10 
    11         protected Implement _implementer;
    12         public Implement Implementer
    13         {
    14             set
    15             {
    16                 _implementer = value;
    17             }
    18         }
    19 
    20         public virtual void Work(string str)
    21         {//必须用VIRTUAL 用ABSTRACT 无法声明主体
    22             _implementer.Execute(str);  
    23         }
    24     }
    25 }
    26 
    27 using System;
    28 using System.Collections.Generic;
    29 using System.Text;
    30 
    31 namespace BridgePatternSam
    32 {
    33     public class OperaterA:Operater
    34     {
    35         public override void Work(string str)
    36         {//
    37             _implementer.Execute(str);
    38         }
    39     }
    40 }
    41 
    42 using System;
    43 using System.Collections.Generic;
    44 using System.Text;
    45 
    46 namespace BridgePatternSam
    47 {
    48     public class OperaterB:Operater 
    49     {
    50         public override void Work(string str)
    51         {
    52             //throw new Exception("The method or operation is not implemented.");
    53             _implementer.Execute(str);
    54         }
    55     }
    56 }
    57 

     具体操作类为:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace BridgePatternSam
     6 {
     7     public abstract class Implement
     8     {//具体操作类
     9         public abstract void Execute(string str);
    10     }
    11 }
    12 
    13 
    14 using System;
    15 using System.Collections.Generic;
    16 using System.Text;
    17 
    18 namespace BridgePatternSam
    19 {
    20     public class JavaImplement:Implement 
    21     {
    22         public override void Execute(string str)
    23         {
    24             //throw new Exception("The method or operation is not implemented.");
    25             Console.WriteLine("----------------------------------------------");
    26             Console.WriteLine("It is carried  out  in  the platform of java!!");
    27             Console.WriteLine("input  information : "+str);
    28             Console.WriteLine("----------------------------------------------");
    29         }
    30     }
    31 }
    32 
    33 using System;
    34 using System.Collections.Generic;
    35 using System.Text;
    36 
    37 namespace BridgePatternSam
    38 {
    39     public class NetImplement:Implement 
    40     {
    41         public override void Execute(string str)
    42         {
    43             Console.WriteLine("----------------------------------------------");
    44             Console.WriteLine("It is carried  out  in  the platform of net!!");
    45             Console.WriteLine("input  information :"+str);
    46             Console.WriteLine("----------------------------------------------");
    47         }
    48     }
    49 }
    50 

    客户端就得相应的组合对象,实现相应的功能:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace BridgePatternSam
     6 {
     7     class Program
     8     {
     9         static void Main(string[] args)
    10         {
    11             Operater oper = new OperaterA();
    12             oper.Implementer = new JavaImplement();
    13             oper.Work("A   java");
    14             Console.ReadLine();
    15 
    16             oper = new OperaterB();
    17             oper.Implementer = new NetImplement();
    18             oper.Work("B   net");
    19             Console.ReadLine();
    20 
    21             oper = new OperaterB();
    22             oper.Implementer = new JavaImplement();
    23             oper.Work("B   JAVA");
    24             Console.ReadLine();
    25         }
    26     }
    27 }
    28 

    写了3种方式的,当然这个是很简单的操作,只是最基础的操作而已,具体情况复杂多了

    显示结果如下:

    ************************************************************

    源代码下载:/Files/jasenkin/BridgePatternSam.rar

  • 相关阅读:
    我容易么?
    意译和音译
    请教博客园高手:msn老是掉线的问题
    超市里最安全的食品
    两类人
    只要牵了手,就请不要轻易的说分手
    Palm Treo 650 .VS. Dopod P800
    强烈推荐一健康食品:紫红薯
    年底三篇
    奶奶,走好!
  • 原文地址:https://www.cnblogs.com/jasenkin/p/1687045.html
Copyright © 2011-2022 走看看