求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

设计模式教程
简单工厂模式
AbstractFactory模式
FactoryMethod模式
Prototype模式
Singleton模式
Template Method模式
Builder模式
Class-Adapter 模式
Facade 模式
Object-Adapter 模式
Bridge模式
 
 

Bridge模式
 
来源:火龙果软件   作者:俎涛
 
1493 次浏览
53次  
 
问题 一个类,存在2个以上的变更维度,而且每个维度都可以独立扩展。如何进行2个维度的变更解耦呢?
环境 一个类,存在2个或者多个维度的变化。
解决方案 1. 基于单一职责应该把类切分为多个维度,每个维度都可能发生变化,所以每个维度都提供抽象和实现。因为多个维度行为需要协调,所以需要把各个维度的在一个主体维度上聚合。
效果 可以2个维度独立变化,然后进行聚合。
实例 通信协议类型和通信数据结构的2个维度变化

结构类图

模式范例

下面对模式给出范例,包括:

  需求,采用用例模型描述

  设计,包括:设计类图,顺序图。

  实现:代码目录。

  运行:运行效果界面

用例模型

用例名称 发布文章
用例概述 根据文章的类型检索文章,根据文章的范围检索对应读者。然后把文章推送给读者。
基本场景 1. User选择文章类型(网页,文档);
2. User 制定发布范围(内部,外部)
3. 系统按照文章类型检索文章
4. 系统按照发布范围检索用户
5. 系统发布文章给用户

模式应用说明

采用和模式方案同样的格式,具体化为当前的应用设计。

问题 一个类Article,存在2个以上的变更维度:文章类型or读者范围,而且每个维度都可以独立扩展。如何进行2个维度的变更解耦呢?
环境 一个类Article,存在2个或者多个维度的变化:文章类型or读者范围。
解决方案 基于单一职责应该把类Article切分为多个维度:文章类型or读者范围,每个维度都可能发生变化,所以每个维度都提供抽象和实现。因为多个维度行为需要协调,所以需要把各个维度的在一个主体维度Article上聚合。
效果 可以2个维度独立变化,然后进行聚合。
实例 一个类Article,存在2个以上的维度:文章类型or读者范围。

设计说明,类图

顺序图:

代码目录

/// <summary>

/// 主维度,文章-Article

/// </summary>

abstract class Article

{

    private Scope scope;

    public Scope Scopes

    {

        get { return scope; }

        set { scope = value; }

    }

 

    public virtual void Publish()

    {

        scope.PublishImpl();

        Console.WriteLine("   发布...");

    }

}

 

//文章的具体子类: 网页

class WebpageArticle : Article

{

    public override void Publish()

    {

        Console.WriteLine("   检索网页...");

        base.Publish();

    }

}

 

//文章的具体子类:文档

class DocumnetArticle : Article

{

    public override void Publish()

    {

        Console.WriteLine("   检索文档...");

        base.Publish();

    }

}

 

/// <summary>

/// 第二个维度,范围

/// </summary>

abstract class Scope

{

    abstract public void PublishImpl();

}

 

 

//范围的具体子类

 

class InsideScope : Scope

{

    public override void PublishImpl()

    {

        Console.WriteLine("   检索内部人员...");

    }

}

 

//范围的具体子类

class OutsideScope : Scope

{

    public override void PublishImpl()

    {

        Console.WriteLine("   检索外部人员...");

    }

 

}

 

class MainApp

{

    static void Main()

    {

        Article article = null;

        Console.Write(请输入 Article 类型,1 代表 WebpageArticle2 代表 DocumnetArticle :");

 

        string articleType = Console.ReadLine();

        switch (articleType)

        {

            case "1":

                article =new  WebpageArticle();

                break;

            case "2":

                article = new DocumnetArticle();

                break;

            default:

                article = new WebpageArticle();

                break;

        }

 

        Scope scope = null;

        Console.Write(请输入 Scope 类型,a 代表 InsideScopeb 代表 OutsideScope :");

 

        string scopeType = Console.ReadLine();

 

        switch (scopeType)

        {

            case "a":

                scope = new InsideScope();

                break;

            case "b":

                scope = new OutsideScope();

                break;

            default:

                scope = new InsideScope();

                break;

        }

 

        article.Scopes = scope;

        Console.WriteLine("  begin  publish-------------------------------");

        article.Publish();

        Console.WriteLine("  end   publish---------------------------------");

    }

}

运行效果


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



1493 次浏览
53次
 捐助