桥接模式介绍
1.实例
假设现在有一支画笔,可以用来画画,画正方形,长方形,三角形(这是java老师上课的时候一定会举的例子),但是现在需要为他们进行上色,即最后的结果是例如: 红色的三角形,绿色的正方形“,等…
- 思考: 现在有两种解决方法
- 为三种不同的形状提供各个颜色的实例(假设有三种形状,三种颜色,总共就要提供九个实例)
优点: 简单容易操作
缺点: 如果需要再加一个形状,就要再需要提供三个实例,如果需要再加一种颜色,就要再加实例,过于麻烦 - 使用桥接模式:提供两个 抽象层,一个是颜色,一个是形状,然后对颜色和形状进行随机组合。
- 为三种不同的形状提供各个颜色的实例(假设有三种形状,三种颜色,总共就要提供九个实例)
2.桥接模式的简单介绍
1. 桥接模式将抽象部分和它的实现部分进行分离,使得它们都可以独立变化
--
2. 桥接模式将继承关系转化为关联关系,它降低了类和类之间的耦合度,减少了系统中类的数量,也减少了代码量
--
3. 将抽象类和实现化之间采用关联关系(组合或者聚合)和部分继承关系,从而使得两者可以相对独立的变化
聚合: 聚合是整体与部分的关系, 并且部分可以离开整体而单独存在(has a)。(大雁和雁群 水果和果篮)
组合: 组合是整体与部分的关系, 并且部分不可以离开整体而单独存在(part of)。(头和人)
--
4.桥接模式可以实现两个抽象层之间实现关联关系
--
桥接模式主要分为几个角色:
1. Abstraction: 抽象类
2. RefinedAbstraction:扩充抽象类
3. Implementor: 实现类接口
4. ConcreteImplementor: 具体实现类
3.桥接模式的代码演示(针对前面的绘画实例)
//抽象颜色层
package com.liz.GOF23.bridge.color;
public interface Color {
public void bePaint(String shape);
}
//实例
public class Green implements Color
{
@Override
public void bePaint(String shape) {
System.out.println("绿色的"+shape);
}
}
public class Red implements Color {
@Override
public void bePaint(String shape) {
System.out.println("红色的"+shape);
}
}
public class Blue implements Color {
@Override
public void bePaint(String shape) {
System.out.println("蓝色的"+shape);
}
}
//抽象形状层
package com.liz.GOF23.bridge.shape;
import com.liz.GOF23.bridge.color.Color;
//在此中不仅仅规范了形状 而且使用了color进行操作 故定义为抽象类
public abstract class Shape {
//抽象类和接口之间实现了组合关系,接口组合入抽象类中
//Shape中的子类使用了color的多态性
public Color color;
public void setColor(Color color){
this.color = color;
}
public abstract void draw();
}
//颜色层实例:
public class Rectangle extends Shape {
@Override
public void draw() {
color.bePaint("三角形");
}
}
public class Circle extends Shape {
@Override
public void draw() {
color.bePaint("圆");
}
}
//实现层
public class Client {
public static void main(String[] args) {
//均都使用了多态性
Color color = new Blue();
Shape circle = new Circle();
//组合要素
circle.setColor(color);
//逻辑操作
circle.draw();
}
}
4.桥接模式总结
优点:
- 分离抽象,接口及其实现部分,体现了比直接继承更好的解决方案,同时在抽象层做到了关联
- 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
- 实现细节对客户透明,可以对用户隐藏实现细节、
缺点:
- 桥接模式的引入会增加系统的理解和设计难度,由于聚合关系建立在抽象层,针对抽象编程比较难
- 桥接模式要求正确识别出系统中独立变化的维度,因此其使用范围具有一定的局限性。
使用场景:
- 如果一个系统需要在构建的抽象化和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系
- 对于那些不希望使用继承,或者滥用继承导致类的个数增加的系统,桥接模式尤其适合
- 当一个类需要在抽象层进行扩展,桥接模式可以体现其灵活性
说在最后:
桥接模式实现了抽象化和实现化的解耦,他们之间相互独立,不会影响到对方
参考文章:https://www.runoob.com/w3cnote/bridge-pattern2.html