一、桥接模式简介(Brief Introduction)

桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化。

Decouple an abstraction from its implementation so that the two can vary independently.。

什么是聚合/组合:

聚合(Aggregation),当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚合关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

场景:商品和他的规格、样式就是聚合关系。

类与类的聚合关系图

组合(Composite,对象A包含对象B,对象B离开对象A没有实际意义。是一种更强的关联关系。人包含手,手离开人的躯体就失去了它应有的作用。

场景: Window窗体由滑动条slider、头部Header 和工作区Panel组合而成。

类与类的组合关系图

聚合与合成原则:尽量使用聚合或者组合,尽量不使用类继承。

对象的继承关系是在编译时就定义好的,所以无法在运行时改变从父类继承的实现 。子类的实现与它的父类有着非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当需要复用子类时,如果集成下来的实现不符合解决新的问题,则父类必然重写或被其他更合适的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

二、解决的问题(What To Solve)

当系统有多维角度分类时,而每一种分类又有可能变化,这时考虑使用桥接模式比较合适。

三、桥接模式分析(Analysis)

1、桥接模式结构

 

Abstraction:业务抽象类,定义一个抽象接口,维护对Impementor的引用.

RefinedAbstraction:具体实现类,被提炼的抽象

Implementor:定义一个抽象实现类,此抽象类与Abstraction类不一定完全相同。Implementor类提供了一些原始的操作,而Abstraction类是对这些原始操作一个更高层次的封装.

ConcreteImplementorAConcreteImplementorA:具体实现

2、代码

1、业务抽象类Abstraction及其提炼出的具体实现类RefinedAbstraction

public abstract class Abstraction

{

protected Implementor _implementor;

public Implementor Implementor

{

set { _implementor = value; }

get { return _implementor; }

}

public virtual void Operation()

{

_implementor.OperationImp();

}

}

public class RefinedAbstraction:Abstraction

{

public override void Operation()

{

_implementor.OperationImp();

}

}

2、抽象实现类Implementor 及其具体实现类ConcreteImplementorA

和ConcreteImplementorB

public abstract class Implementor

{

public abstract void OperationImp();

}

public class ConcreteImplementorA:Implementor

{

public override void OperationImp()

{

Console.WriteLine("{0} Operation Method",this.GetType().Name);

}

}

public class ConcreteImplementorB:Implementor

{

public override void OperationImp()

{

Console.WriteLine("{0} Operation Method", this.GetType().Name);

}

}

2、客户端代码

static void Main(string[] args)

{

Abstraction a1 = new RefinedAbstraction();

// Set implementation and call

a1.Implementor = new ConcreteImplementorA();

a1.Operation();

// Change implemention and call

a1.Implementor = new ConcreteImplementorB();

a1.Operation();

Console.ReadKey();

}

3、实例运行结果

四.桥接模式实例分析(Example)

1、场景

业务对象(BusinessObject)与数据对象(DataObject)分离,即业务对象CustormerBase与数据对象DataObject分离。业务对象CustormerBase完成更高层次的业务操作。结构如下图所示

CustomersBasel:定义一个抽象接口,维护对DataObject的引用。

Custorers:被提炼的抽象。

DataObject:数据抽象类主要操作有添加纪录。删除纪录、定位Next纪录、定位Prior纪录,展示所有纪录,展示当前纪录等。

CustomersData:数据抽象类的具体实现。

2、代码

1、抽象接口CustomersBase及其具体实现类Customers

class CustomersBase

{

private DataObject _dataObject;

protected string group;

public CustomersBase(string group)

{

this.group = group;

}

// Property

public DataObject Data

{

set { _dataObject = value; }

get { return _dataObject; }

}

public virtual void Next()

{

_dataObject.NextRecord();

}

public virtual void Prior()

{

_dataObject.PriorRecord();

}

public virtual void Add(string customer)

{

_dataObject.AddRecord(customer);

}

public virtual void Delete(string customer)

{

_dataObject.DeleteRecord(customer);

}

public virtual void Show()

{

_dataObject.ShowRecord();

}

public virtual void ShowAll()

{

Console.WriteLine("Customer Group: " + group);

_dataObject.ShowAllRecords();

}

}

/// <summary>

/// The 'RefinedAbstraction' class

/// </summary>

class Customers : CustomersBase

{

// Constructor

public Customers(string group)

: base(group)

{

}

public override void ShowAll()

{

// Add separator lines

Console.WriteLine();

Console.WriteLine("**************************");

base.ShowAll();

Console.WriteLine("**************************");

}

}

2、抽象数据对象类DataObject及其具体实现类CustomersData

abstract class DataObject

{

public abstract void NextRecord();

public abstract void PriorRecord();

public abstract void AddRecord(string name);

public abstract void DeleteRecord(string name);

public abstract void ShowRecord();

public abstract void ShowAllRecords();

}

/// <summary>

/// The 'ConcreteImplementor' class

/// </summary>

class CustomersData : DataObject

{

private List<string> _customers = new List<string>();

private int _current = 0;

public CustomersData()

{

// Loaded from a database

_customers.Add("James Hao");

_customers.Add("灵动生活");

_customers.Add("郝**");

_customers.Add("*宪*");

_customers.Add("**玮");

}

public override void NextRecord()

{

if (_current <= _customers.Count - 1)

{

_current++;

}

}

public override void PriorRecord()

{

if (_current > 0)

{

_current--;

}

}

public override void AddRecord(string customer)

{

_customers.Add(customer);

}

public override void DeleteRecord(string customer)

{

_customers.Remove(customer);

}

public override void ShowRecord()

{

Console.WriteLine(_customers[_current]);

}

public override void ShowAllRecords()

{

foreach (string customer in _customers)

{

Console.WriteLine(" " + customer);

}

}

}

3、客户端代码

static void Main(string[] args)

{

// Create RefinedAbstraction

CustomersBase customers = new Customers("Shandong  Province");

// Set ConcreteImplementor

customers.Data = new CustomersData();

// Exercise the bridge

customers.Show();

customers.Next();

customers.Show();

customers.Next();

customers.Show();

customers.Add("Hao xianwei");

customers.ShowAll();

Console.ReadKey();

}

3、实例运行结果

五、总结(Summary)

本文对桥接模式(Bridge Pattern)的概念、设计结构图、代码、使用场景、聚合与合成原则以及什么是聚合/合成进行了描述。以一个桥接模式实例进行了说明。桥接模式是比较常用和简单的设计模式。当系统有多维角度分类时,而每一种分类又有可能变化,可以考虑使用桥接模式。

转载自:http://www.cnblogs.com/ywqu/archive/2010/01/15/1648280.html

Net设计模式实例之桥接模式( Bridge Pattern)的更多相关文章

  1. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  2. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  3. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  4. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

  5. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

  6. 转:设计模式-----桥接模式(Bridge Pattern)

    转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...

  7. C#设计模式——桥接模式(Bridge Pattern)

    一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...

  8. 设计模式学习心得<桥接模式 Bridge>

    说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...

  9. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

随机推荐

  1. java身份证验证

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  2. #IrrlichtEngine# Example1 HelloWorld

    配置IDE环境来使用irrlicht引擎: (VS2012下)菜单栏项目 -> 项目属性窗口下 C/C++ -> 常规 -> 附加包含目录中添加irrlicnt引擎文件目录下incl ...

  3. 电子商务网站SQL注入项目实战一例

    故事A段:发现整站SQL对外输出: 有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓 ...

  4. 10年微软MVP路(如何成为一个MVP?)

    搞微软技术的,大家或多或少都有听说过微软的"最有价值专家"(MVP), 从2006年到2015年连续10年ASP.NET/IIS MVP.当年很多一起搞微软技术的朋友都转搞其他非微 ...

  5. ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug

    Microsoft最近发布了ASP.NET Identity 2,该版本支持双重认证.帐号锁定以及防伪印章功能,还增强了用户帐号和索引.此外新版本还包含一个改进的密码验证器并修复了一些bug. 借助于 ...

  6. Visual Studio LightSwitch

    LightSwitch是一个基于模板的自动化开发Silverlight和HTML5应用程序的工具,不同于一般的基于数据字典,配置生成的应用程序的工具,因为LightSwtich提供的所有模板都是可以扩 ...

  7. .NET面试题系列[0] - 写在前面

    .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] - .NET框架基础知识(2) .NET面试题系列[3] - C# 基础知识(1) .NET ...

  8. ABP框架理论学习之Hangfire集成

    返回总目录 Hangfire是一个综合的后台工作管理者.你可以将Hangfire集成到ABP中,这样就可以不使用默认的后台工作管理者了.但你仍然可以为Hangfire使用相同的后台工作API.这样,你 ...

  9. ReactJS入门(四)—— 组件API

    本篇将介绍 React 组件的API,其中主要的几个API我们在第一篇的时候便已介绍过,这里可以做个温故知新. 本篇的代码你也可以在我的Github上获取到. setState 参数: nextSta ...

  10. C#中使用Socket实现简单Web服务器

    上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...