桥接模式

桥接模式属于结构型模式

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

桥接模式是为了解决继承的缺点而提出的设计模式,将系统各维度抽象出来,各维度独立变化,之后可通过聚合,将各维度组合起来,减少它们之间耦合

模式类图

以游戏为例,游戏可以按品牌分为任天堂游戏和腾讯游戏两种,显示器可以分为CRT,LCD显示器

​ 将游戏和显示器分为两个维度,当两个维度都可以独立变化时,使用聚合将各维度组合,这时如果要增加一个游戏或者显示器,只需要增加相应子类就可以

优点
  1. 桥接模式主要作用就是解耦,解决多重继承导致的问题,将抽象和实现的分离
  2. 优秀的扩展能力,想扩展就增加实现
  3. 通过抽象层进行聚合完成封装,实现细节对客户透明
缺点

会增加系统的理解与设计难度

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

抽象游戏类

AbstractGame,按游戏分类

/**
 * @author: chenmingyu
 * @date: 2019/3/11 17:13
 * @description: 抽象游戏类
 */
public abstract class AbstractGame {

    protected AbstractDisplayer displayer;

    public void setAbstractDisplayer(AbstractDisplayer displayer) {
        this.displayer = displayer;
    }

    /**
     * 玩游戏
     */
    public abstract void play();
}
具体游戏实现

任天堂游戏

/**
 * @author: chenmingyu
 * @date: 2019/3/11 17:17
 * @description: 任天堂游戏
 */
public class NintendoGame extends AbstractGame{

    @Override
    public void play() {
        System.out.println("启动任天堂游戏");
        displayer.run();
    }
}

腾讯游戏

/**
 * @author: chenmingyu
 * @date: 2019/3/11 17:21
 * @description:
 */
public class TencentGame extends AbstractGame {

    @Override
    public void play() {
        System.out.println("启动腾讯游戏");
        displayer.run();
    }
}
抽象显示器类

AbstractDisplayer 按显示器分类

/**
 * @author: chenmingyu
 * @date: 2019/3/11 17:25
 * @description: 抽象显示器
 */
public abstract class AbstractDisplayer {

    /**
     * 运行
     */
    public abstract void run();
}

LCD显示器

/**
 * @author: chenmingyu
 * @date: 2019/3/11 17:27
 * @description: LCD显示器
 */
public class LCDDisplay extends AbstractDisplayer{

    @Override
    public void run() {
        System.out.println("运行 LCD显示器");
    }
}

CRT显示器

/**
 * @author: chenmingyu
 * @date: 2019/3/11 17:28
 * @description: CRT显示器
 */
public class CRTDisplayer extends AbstractDisplayer {

    @Override
    public void run() {
        System.out.println("运行 CRT显示器");
    }
}
验证

通过聚合实现不同游戏使用不同那个的显示器玩

public static void main(String[] args) {

    AbstractGame nintendoGame = new NintendoGame();
    nintendoGame.setAbstractDisplayer(new LCDDisplay());
    nintendoGame.play();
    AbstractGame tencentGame = new TencentGame();
    tencentGame.setAbstractDisplayer(new CRTDisplayer());
    tencentGame.play();
}

输出

启动任天堂游戏
运行彩色显示器
启动腾讯游戏
运行老式黑白显示器

桥接模式使用了类间的聚合关系、继承、覆写等常用功能,但是它却提供了一个非常清晰、稳定的架构。

参考:

​ 设计模式之禅:https://www.kancloud.cn/sstd521/design/193620

​ 桥接模式|菜鸟教程:http://www.runoob.com/design-pattern/bridge-pattern.html

推荐阅读:23种设计模式详解