当前位置: 移动技术网 > IT编程>开发语言>PHP > 桥接模式学习总结

桥接模式学习总结

2020年07月22日  | 移动技术网IT编程  | 我要评论

桥接模式

引言

假如一个系统需要加入报表模块,主要的开发点是数据的获取和报表的显示方式。数据的获取可能是从系统数据库中读取数据,也可能是从Excel文件中读取数据,还可以是通过接口获取数据等。报表的显示方式也繁多,比如用柱状图显示,用表格显示,用折线图显示等。如果对每一种情况都设计一个类,那么要实现该系统需要的类的数量是非常庞大的(数据的获取方式*报表显示方式)。那么如何设计这样的系统呢?本文通过该案例,介绍桥接模式。

桥接模式重要等级★★★☆☆          桥接模式难度等级★★★☆☆

定义

英文定义"Decouple an abstraction from its implementation so that the two can vary independently."。

将抽象部分与它的实现部分分离。使他们都可以独立地变化。

模式结构图

桥接模式主要包括以下角色:

(1)Abstraction(抽象类)

(2)RefinedAbstraction(扩充抽象类)

(3)Implementor(实现类接口)

(4)ConcreteImplementor(具体实现类)

实例

实例描述

以博文开头的报表模块为例,用桥接模式设计该报表模块。通过分析,该实例类图如下所示:

代码实现

Report(抽象报表类)

abstract class Report
{
    private CollectData data;

    internal CollectData Data { get => data; set => data = value; }

    public void Show()
    {
        data.Collect();
        ShowByChart();
    }

    protected abstract void ShowByChart();
}

CollectData(收集数据接口)

interface CollectData
{
    void Collect();
}

FromInterface(接口获取数据)

class FromInterface : CollectData
{
    public void Collect()
    {
        Console.Write("从系统接口获取数据,");
    }
}

FromExcel(Excel文件读取数据)

class FromExcel : CollectData
{
    public void Collect()
    {
        Console.Write("从Excel文件获取数据,");
    }
}

FromDataBase(数据库读取数据)

class FromDataBase : CollectData
{
    public void Collect()
    {
        Console.Write("从数据库获取数据,");
    }
}

GridReport(数据表格报表)

class GridReport : Report
{
    protected override void ShowByChart()
    {
        Console.WriteLine("用数据表格展示数据。");
    }
}

BarChartReport(柱状图报表)

class BarChartReport : Report
{
    protected override void ShowByChart()
    {
        Console.WriteLine("用柱状图展示数据。");
    }
}

LineChartReport(折线图报表)

class LineChartReport:Report
{
    protected override void ShowByChart()
    {
        Console.WriteLine("用折线图展示数据。");
    }
}

测试代码

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("报表A:");
        Report report = new GridReport();
        report.Data = new FromExcel();
        report.Show();

        Console.WriteLine("报表B:");
        report = new BarChartReport();
        report.Data = new FromDataBase();
        report.Show();

        Console.WriteLine("报表C:");
        report = new LineChartReport();
        report.Data = new FromInterface();
        report.Show();

        Console.ReadKey();
    }
}

运行结果

总结

模式优点

(1)抽象化和实现化脱耦,使得二者可以独立地变化。由于抽象化和实现化不在同一继承层次结构中,因此他们可以分别用他们的子类进行组合,形成多维度的组合对象

(2)桥接模式可以达到多继承的效果,又不会违背类的单一职责原则。

(3)系统可扩展性很高,桥接模式各个维度的变化是独立地,因此任意扩展一个维度,都不会影响其他维度。

(4)透明度高。用户面向抽象层,对不同的维度通过聚合关系进行组合。

模式缺点

(1)桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

(2)桥接模式要求正确识别出系统中独立变化的维度,因此其使用范围具有一定的局限性。

 

本文地址:https://blog.csdn.net/chen_xuyuan/article/details/85925870

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网