Bridge:桥接
Abstraction:抽象类
Implementor:实现
concrete:具体的
角色
Client 类:桥接模式的调用者
Abstraction:维护了 Implementor/ 即它的实现类 ConcreteImplementorA.., 二者是聚合关系,Abstraction充当桥接类
xxxAbstraction :抽象的具体子类
Implementor :行为实现类的接口
ConcreteImplementorA /B:具体行为的实现类A、B
案例
需求:手机(型号 + 品牌)操作问题;
完成手机各品牌各型号的项目设计;
列如:折叠式的华为、小米、Vivo,直立式的华为、小米、Vivo,旋转式的、滑盖的...
要求该项目设计易于扩展
接下来我们来看看桥接模式是如何设计的?
package com.javaxl.design.bridge;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2020-02-22 17:29
* <p>
* 手机型号
*/
public abstract class Abstraction {
protected Implementor implementor;
public abstract void call();
}
class Folded extends Abstraction {
private String name = "折叠式";
Folded(Implementor implementor) {
this.implementor = implementor;
}
@Override
public void call() {
System.out.println(this.implementor.getName() + this.name + "正在通话中");
}
}
class Upright extends Abstraction {
private String name = "直立式";
Upright(Implementor implementor) {
this.implementor = implementor;
}
@Override
public void call() {
System.out.println(this.implementor.getName() + this.name + "正在通话中");
}
}
class Slide extends Abstraction {
private String name = "滑盖式";
Slide(Implementor implementor) {
this.implementor = implementor;
}
@Override
public void call() {
System.out.println(this.implementor.getName() + this.name + "正在通话中");
}
}
package com.javaxl.design.bridge;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2020-02-22 17:29
* 手机品牌
*/
public interface Implementor {
String getName();
}
class HW implements Implementor{
private String name = "华为";
@Override
public String getName() {
return name;
}
}
class Mi implements Implementor{
private String name = "小米";
@Override
public String getName() {
return name;
}
}
class Vivo implements Implementor{
private String name = "Vivo";
@Override
public String getName() {
return name;
}
}
public class Client {
public static void main(String[] args) {
Folded folded = new Folded(new HW());
folded.call();
Upright upright = new Upright(new Mi());
upright.call();
Slide slide = new Slide(new Vivo());
slide.call();
}
}
使用桥接模式,对该项目进行设计,型号或品牌的扩展,都不会影响另一方;
即手机型号扩展,手机品牌不受影响;手机品牌的上市退市,不会影响到手机型号;
注意事项及细节
实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
注意: 1、桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程 2、桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。
应用
JDBC的Driver驱动类
总结
从上面我们可以看到这种方式的实现的好处了,首先如果我们想使用这些元素做其他的事情,我们只需要继承功能层次的类即可,如果我们想增加的新元素,我们只需要修改实现层次的上下两层的方法,然后就可以使用了,这样思路非常清晰,将功能和组成功能的子功能的实现隔离开来,可以随意的组合,便于组件化编程,比如我们将实现层次作为组件,我们只需要使用委托(组合)将我们想要实现的功能托付给实现层次来完成就好了,大大的提高了可重用性。那么到底什么是桥接呢,在哪里体现的?我想大家都知道了,那就是在委托的地方体现了,这就是桥,一座沟通功能层次和实现层次的桥。由此我们也看到,设计模式其实就是为了最大限度的实现代码的可重用性,为此可谓是绞尽脑汁,实现了之后就能够组件化,可移植,可扩展,从而高内聚低耦合,设计模式,我们已经渐渐地感受到了提取的初衷和意义。
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有