Net设计模式实例之桥接模式( Bridge Pattern)
一、桥接模式简介(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类是对这些原始操作一个更高层次的封装.
ConcreteImplementorA,ConcreteImplementorA类:具体实现
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)的更多相关文章
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
随机推荐
- 享元模式 - Flyweight
Flyweight(享元模式) 定义 GOF:运用共享技术有效地支持大量细粒度的对象. GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享. 例子 在你的游戏场景中 ...
- 夜深了,写了个JQuery的省市区三级级联效果
刚刚练手的JQuery,希望大神们指正 主要实现以下功能: 1.三级菜单级联加载数据 2.可以在不操作脚本的情况下,给元素加属性实现级联功能 3.自定义动态显示数据 咨询问题: 对于一般比较固定不变的 ...
- IDisposable的另类用法
IDisposable是.Net中一个很重要的接口,一般用来释放非托管资源,我们知道在使用了IDisposable的对象之后一定要调用IDisposable.Dispose()方法,或者使用.Net提 ...
- Fd.Service 轻量级WebApi框架
News December 06 2014: Version 1.0.0.8Add Register Route Configuration iis 7 Integrated Mode: <sy ...
- TCP状态
TCP状态 TCP连接中包含不同的状态,如何通过状态来判断程序问题尤为重要. 三次握手 图中的connection部分为三次握手. 四次握手 图中的close部分为四次握手. CLOSE_WAIT 服 ...
- C#设计模式之观察者
Iron之观察者 引言 上一篇说的职责链模式,很有意思的一个模式,今天这个模式也是很有意思的一个模式,还是不啰嗦了直接进入主题吧. 场景介绍:在上一遍中说到用到部件检测,很巧妙的让调用者和处理者解耦了 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...
- 每天一个linux命令(18):locate 命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- python安装locustio报错error: invalid command 'bdist_wheel'的解决方法
locust--scalable user load testing tool writen in Python(是用python写的.规模化.可扩展的测试性能的工具) 安装locustio需要的环境 ...
- linux创建进程fork的方法步骤
fork创建进程 函数原型如下 #include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数 pid_t fork(void); //void代表没有 ...