C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

模式设计c#--结构型--Bridge

名称 Bridge
结构 o_bridge.bmp
意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
适用性
  • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时B r i d g e 模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
  • (C + +)你想对客户完全隐藏抽象的实现部分。在C + +中,类的表示在类接口中是可见的。
  • 有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。R u m b a u g h 称这种类层次结构为“嵌套的普化”(nested generalizations )。
  • 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是C o p l i e n 的S t r i n g 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。

Code Example
namespace Bridge_DesignPattern
{
    
using System;

    
class Abstraction 
    
{
        
protected Implementation impToUse;

        
public void SetImplementation(Implementation i)
        
{
            impToUse 
= i;
        }


        
virtual public void DumpString(string str)
        
{
            impToUse.DoStringOp(str);                   
        }

    }


    
class DerivedAbstraction_One : Abstraction 
    
{
        
override public void DumpString(string str)
        
{
            str 
+= ".com";
            impToUse.DoStringOp(str);            
        }
        
    }


    
class Implementation 
    
{
        
public virtual void DoStringOp(string str)
        
{
            Console.WriteLine(
"Standard implementation - print string as is");
            Console.WriteLine(
"string = {0}", str);
        }
        
    }


    
class DerivedImplementation_One : Implementation 
    
{
        
override public void DoStringOp(string str)
        
{
            Console.WriteLine(
"DerivedImplementation_One - don't print string");
        }
    
    }


    
class DerivedImplementation_Two : Implementation 
    
{
        
override public void DoStringOp(string str)
        
{
            Console.WriteLine(
"DerivedImplementation_Two - print string twice");
            Console.WriteLine(
"string = {0}", str);
            Console.WriteLine(
"string = {0}", str);
        }
    
    }

    
    
/// <summary>
    
///    Summary description for Client.
    
/// </summary>

    public class Client
    
{
        Abstraction SetupMyParticularAbstraction() 
        
{
            
// we localize to this method the decision which abstraction and
            
// which implementation to use. These need to be decided 
            
// somewhere and we do it here. All teh rest of the client 
            
// code can work against the abstraction object. 
            Abstraction a = new DerivedAbstraction_One();
            a.SetImplementation(
new DerivedImplementation_Two());
            
return a;
        }


        
public static int Main(string[] args)
        
{         
            Client c 
= new Client();
            Abstraction a 
= c.SetupMyParticularAbstraction();
                
            
// From here on client code thinks it is talking to the 
            
// abstraction, and will not need to be changed as 
            
// derived abstractions are changed. 

            
// more client code using the abstraction goes here 
            
// . . . 
            a.DumpString("Clipcode");

            
return 0;
        }

    }

}

posted on 2006-01-03 15:43 梦在天涯 阅读(947) 评论(2)  编辑 收藏 引用 所属分类: Design pattern

评论

# re: 模式设计c#--结构型--Bridge 2006-04-24 14:32 梦在天涯

在什么情况下应当使用桥梁模式
根据上面的分析,在以下的情况下应当使用桥梁模式:

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。  回复  更多评论   

# re: 模式设计c#--结构型--Bridge 2006-04-24 14:33 梦在天涯

桥梁模式的用意

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

抽象化

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

实现化

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

脱耦

所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。

将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1797013
  • 排名 - 5

最新评论

阅读排行榜