23种设计模式-20-桥接模式

来源:互联网 发布:小脚趾内翻怎么办知乎 编辑:程序博客网 时间:2024/06/10 02:59


目录(?)
[-]

  1. 一桥接模式简介Brief Introduction
  2. 二解决的问题What To Solve
  3. 三桥接模式分析Analysis
    1. 桥接模式结构
    2. 代码
    3. 实例运行结果
  4. 四桥接模式实例分析Example
    1. 场景
    2. 代码
    3. 实例运行结果
  5. 五总结Summary

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