设计模式——桥接模式详解

桥接模式(抽象与实现分离)

1.1⭐桥接模式的定义

维基百科:桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。

百度百科:桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。

1.2☘️桥接模式的结构

桥接(Bridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

1.3桥接模式简单案例及代码演示

**举个:**假设有一个歌手,他的名字叫磊磊。磊磊会用嘴唱歌,磊磊会边弹吉他边唱歌。但是磊磊是个十分好学的孩子不满足于现状,于是他报了个机构叫白马教育,并且成为了Good Singer班中的一员。在进行了长达两年半的学习之后,磊磊凭借着过人的天赋学会了边弹钢琴边唱歌。

如何实现???

a.传统思路:

定义一个演员类,将用嘴唱歌,用吉他唱歌,用钢琴唱歌写到这个类中。

缺点很明显,如果又来了一个人怎么办,如果又学会的一个乐器怎么办,显然不易扩展。

b.桥接模式思路:

在抽象类中

1.将需要桥接的接口拿到父类里

2.直接将接口属性丢到构造方法里,同时要在子类构造该方法

3.调用桥接属性开始“表演”

代码演示:

1.定义抽象演员类(Perfomer)

package com.qf.bridge;

/**
 * @author ###
 */
public abstract class Perfomer{
    //桥接属性
    protected IplayType playType;
    //构造表演方法
    public Perfomer(IplayType playType){
        this.playType=playType;

    }
    //表演
    abstract protected void perform();
}

2.定义磊磊类,继承抽象演员类

package com.qf.bridge;

public class Leilei extends Perfomer{
    //构造方法传递需要的乐器表演方式
    public Leilei(IplayType playType) {
        super(playType);
    }

    @Override
    protected void perform() {
        playType.play("磊磊");
    }
}

3.设计乐器表演接口,包含一个play方法

package com.qf.bridge;

//表演方式
public interface IplayType{
    void play(String name);
}

4.定义吉他表演类遵从乐器表演接口

package com.qf.bridge;

public class Guitar implements IplayType {
    @Override
    public void play(String name) {
        System.out.println(name+"用吉他唱歌了");
    }
}

5.定义嘴巴类遵从乐器表演类

package com.qf.bridge;

public class Mouth implements IplayType{
    @Override
    public void play(String name) {
        System.out.println(name+"用嘴唱歌了");
    }
}

6.Test

package com.qf.bridge;

public class Demo1 {
    public static void main(String[] args) {
        Perfomer mouth = new Leilei(new Mouth());
        mouth.perform();

        Perfomer guitar = new Leilei(new Guitar());
        guitar.perform();

    }
}

结果展示:

设计模式——桥接模式详解_第1张图片

1.4桥接模式的UML图

稍作解释:

1.+表示public,-表示private,#表示protected

2.聚合关系可以用【带空心菱形的实线】来表示,菱形指向整体。(如:teacher是university的一个部分)

3.继承关系用【带空心三角箭头的实线】来表示,箭头从子类指向父类。

虚假的UML图:

设计模式——桥接模式详解_第2张图片

真正的UML图:

设计模式——桥接模式详解_第3张图片

设计模式——桥接模式详解_第4张图片

1.5桥接模式的应用场景

跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等

1.6☘️桥接模式的优缺点

优点:

  1. 分离抽象接口及其实现部分。使得抽象和实现可以沿着各自的维度来变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。

  2. 在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。

    多继承是指一个类可以同时从多个父类继承属性和方法。这种继承方式可以让子类同时拥有多个父类的特征,但也可能带来一些问题,比如构造函数的执行顺序和类中同名变量冲突等

  3. 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。

缺点:

  1. 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

1.7桥接模式与其他模式的区别

1.桥接模式与策略模式的区别

设计模式——桥接模式详解_第5张图片

设计模式——桥接模式详解_第6张图片

1.桥接模式中不仅Implementor具有变化 ,而且Abstraction也可以发生变化,而且两者的变化是完全独立的

2.策略模式仅仅通过Abstraction与 Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。

3.策略模式的目的是封装一系列的算法,使得这些算法可以相互替换;而桥接模式的目的是分离抽象和实现部分,使得它们可以独立的变化。

2.前面的路以后再来探索吧……………………….

你可能感兴趣的:(笔记,设计模式,桥接模式,java)