软件设计模式及体系结构之桥接模式

Posted lpblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件设计模式及体系结构之桥接模式相关的知识,希望对你有一定的参考价值。

桥接模式前言


分析:
蜡笔:颜色和型号两个不同的变化维度(即两个化原因)耦合在一起,无论是对颜色进行扩展还
对型号进行扩展都势必会影响另一个维度
毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响

1.桥接模式的定义

在软件开发中如何将多个变化维度分离?
桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化.
1.又被称为柄体( Handle and body)模式或接口( Interface)模式
2.用抽象关联取代了传统的多层继承
3.将类之间的静态继承关系转换为动态的
对象组合关系

2.桥接模式的结构与实现


桥接模式包含以下4个角色:
Abstraction(抽象类)
Refinedabstraction(扩充抽象类)
Implementor(实现类接口)
Concretelmplementor(具体实现类)


3.实例

某软件公司要开发一个跨平台图像浏览系统,要求该系统能够显示BMP,JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、UNIX等多个操作系统系统首先将各种格式的文件解析为像素矩然后将像素矩阵显示在在不同的操作系统中可以调不同的绘制函数来绘制像素矩阵。另外,系统需具有较好的扩展性在将来支持新的文件格式和操作系统。试使用桥接模式设计该跨平台图像浏览系统

1)Matrⅸx:像素矩阵类,辅助类
2) ImageImp:抽象操作系统实现类,充当实现类接口
3) WindowsImp: Windows操作系统实现类,充当具体实现类
4) LinuxImp: Linux操作系统实现类,充当具体实现类
5) UnixImp:UNX操作系统实现类,充当具体实现类
6) Image:抽象图像类,充当抽象类
7) JPGImage:JPG格式图像类,充当扩充抽象类
8) PNGImage:PNG格式图像类,充当扩充抽象类
9) BMPImage:BMP格式图像类,充当打充抽象类
10) GIFImage:GIF格式图像类,充当扩充抽象类
11) Client:客户端测试类

结果及分析

如果需要更换图像文件格式或者更换操作系统,只需修改配置文件即可

设计模式之桥接模式

基本认识

将抽象和实现解耦,使得两者可以独立地变化

是一种结构型设计模式

桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

桥接模式虽然是一个使用频率不高的模式,但是熟悉该模式对于理解面向对象的设计原则,包括开闭原则都很有帮助,有助于形成正确的设计思想和培养良好的设计风格。

技术图片
  • Client类:桥接模式的调用者。
  • 抽象类(Abstraction):维护了Implementor及它的实现类ConcreteImplementorA。二者是聚合关系,Abstraction充当桥接类。
  • RefinedAbstraction:是Abstraction抽象类的子类。
  • Implementor:行为实现类的接口。
  • ConcreteImplementorA/B:行为的具体实现类。

传统方式

案例

现在对不同手机类型的不同品牌实现编程操作,比如开机、关机、打电话等。

技术图片

思路分析

技术图片

问题分析

扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。

违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。

解决方案:使用桥接模式

桥接模式

思路分析

技术图片

代码实现

1public interface Brand {
2    void open();
3
4    void close();
5
6    void call();
7}

 1public class Vivo implements Brand {
2    @Override
3    public void open() {
4        System.out.println("Vivo手机开机");
5    }
6
7    @Override
8    public void close() {
9        System.out.println("Vivo手机关机");
10    }
11
12    @Override
13    public void call() {
14        System.out.println("Vivo手机打电话");
15    }
16}

 1public class XiaoMi implements Brand {
2    @Override
3    public void open() {
4        System.out.println("小米手机开机了");
5    }
6
7    @Override
8    public void close() {
9        System.out.println("小米手机关机了");
10    }
11
12    @Override
13    public void call() {
14        System.out.println("小米手机打电话");
15    }
16}

 1public abstract class Phone {
2
3    private Brand brand;//组合品牌
4
5    public Phone(Brand brand) {//构造器
6        this.brand = brand;
7    }
8
9    protected void open() {
10        this.brand.open();
11    }
12
13    protected void close() {
14        this.brand.close();
15    }
16
17    protected void call() {
18        this.brand.call();
19    }
20}

 1//折叠式手机类
2public class FoldedPhone extends Phone {
3    public FoldedPhone(Brand brand) {
4        super(brand);
5    }
6
7    public void open(){
8        super.open();
9        System.out.println("折叠样式手机");
10    }
11    public void close(){
12        super.close();
13        System.out.println("折叠样式手机");
14    }
15    public void call(){
16        super.call();
17        System.out.println("折叠样式手机");
18    }
19}

注意事项

实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。

对于系统的高层部分,只需知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。

桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

桥接模式要求正确识别出系统中两个独立变化的维度(抽象、实现),因此其适用范围有一定的局限性,即需要有这样的应用场景。

对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。


















































































以上是关于软件设计模式及体系结构之桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之桥接模式应用例题

结构型模式之桥接模式

设计模式之桥接模式

结构型设计模式 之 桥接模式

设计模式之桥接模式优秀的程序结构(十五)

设计模式之桥接模式