Java 设计模式之桥接学习与掌握
Posted 邹奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之桥接学习与掌握相关的知识,希望对你有一定的参考价值。
定义
- 将抽象与实现分离,使它们可以独立变化。
它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
优点
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
- 抽象与实现分离,扩展能力强
缺点
- 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
桥接模式的结构与实现
将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
模式的结构
该模式主要包含以下角色:
- 【抽象化角色】- 定义一个抽象类,并包含一个对实现化角色对象的引用
- 【扩展抽象化角色】- 是抽象化角色的子类,实现父类中定义的抽象业务方法,并通过组合关系调用实现化角色中的方法
- 【实现化角色】- 定义实现化角色接口,供扩展抽象化角色调用
- 【具体实现化角色】- 给出实现化角色接口的具体实现
模式的实现
实现化接口角色。如下:
package com.example.designmodedemo.principle.bridge;
/**
* 实现化接口角色
*/
public interface Impls {
void doBusinessIml();
}
具体实现化角色。如下:
package com.example.designmodedemo.principle.bridge;
/**
* 具体实现化角色 - 即实现化接口角色的具体实现
*/
public class ChildImpls implements Impls{
@Override
public void doBusinessIml() {
System.out.println(":> 访问具体实现化角色");
}
}
抽象化角色。如下:
package com.example.designmodedemo.principle.bridge;
/**
* 抽象化角色
*/
public abstract class Abstraction {
protected Impls impls;
protected Abstraction(Impls impls){
this.impls = impls;
}
// 定义抽象业务方法,子类实现
public abstract void doBusiness();
}
扩展抽象化角色。如下:
package com.example.designmodedemo.principle.bridge;
/**
* 扩展抽象化角色-即抽象化角色的子类
*/
public class ChildAbs extends Abstraction{
public ChildAbs(Impls impls) {
super(impls);
}
@Override
public void doBusiness() {
System.out.println(":> 访问扩展抽象化角色");
impls.doBusinessIml();
}
}
客户端调用代码如下:
/**
* 桥接模式
*/
private void principle_bridge() {
Impls impls = new ChildImpls();
Abstraction abstraction = new ChildAbs(impls);
abstraction.doBusiness();
}
输入结果如下图:
应用场景
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。
通常适用场景如下:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
桥接模式的一个常见使用场景就是替换继承。但是继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。
因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承。
技术永不眠!我们下期见!
以上是关于Java 设计模式之桥接学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章