假如一个系统需要加入报表模块,主要的开发点是数据的获取和报表的显示方式。数据的获取可能是从系统数据库中读取数据,也可能是从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
如对本文有疑问, 点击进行留言回复!!
20.7.17 笔记算数运算符 复合运算符重载 比较运算重载 多态 设计原则 类的单一职责 依赖倒置 组合复用原则 里氏替换 迪米特法则 矩阵转置原理
网友评论