设想你要绘制上图的九种图形,通过继承关系你需要创建12个类。万一以后需要绿色菱形,你还得再创建2个类。这样会无休止的创建类。
图片.png
上图通过两个维度的变化就幻化出无数的图形。
基础概念
桥接(Bridge)是用于把抽象化(图形)与实现化(颜色)解耦,使得二者可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
意图
将抽象部分与实现部分分离,使它们都可以独立的变化。
主要解决
在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
何时使用
实现系统可能有多个角度分类,每一种角度都可能变化。
如何解决
把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
关键代码
抽象类依赖实现类。组合别人的是抽象类,被组合的是实现类
优点
1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
适用于以下场景:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
桥接(Bridge)模式包含以下主要角色:
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
抽象化角色
package com.geely.design.pattern.structural.bridge.wbp;
/**
* 抽象化角色
* @Author: wenbaipei
* @Date: 2019/11/29 16:02
* @Version 1.0
*/
public abstract class AFigure {
IColour iColour;
public AFigure(IColour iColour){
this.iColour = iColour;
}
abstract void generateFigureWithColour();
}
扩展抽象化角色
package com.geely.design.pattern.structural.bridge.wbp;
/**
* 抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
* @Author: wenbaipei
* @Date: 2019/11/29 16:06
* @Version 1.0
*/
public class Rectangle extends AFigure{
public Rectangle(IColour iColour) {
super(iColour);
}
@Override
void generateFigureWithColour() {
String figure = "我是长方形";
String colour = iColour.tintage();
System.out.println(figure+" "+colour);
}
}
package com.geely.design.pattern.structural.bridge.wbp;
/**
* 抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
* @Author: wenbaipei
* @Date: 2019/11/29 16:14
* @Version 1.0
*/
public class Cycle extends AFigure {
public Cycle(IColour iColour) {
super(iColour);
}
@Override
void generateFigureWithColour() {
String figure = "我是圆形";
String colour = iColour.tintage();
System.out.println(figure+" "+colour);
}
}
实现化角色
package com.geely.design.pattern.structural.bridge.wbp;
/**
* 实现化角色的接口,供扩展抽象化角色调用
* @Author: wenbaipei
* @Date: 2019/11/29 16:03
* @Version 1.0
*/
public interface IColour {
String tintage();
}
具体实现化角色
package com.geely.design.pattern.structural.bridge.wbp;
/**
* 给出实现化角色接口的具体实现
* @Author: wenbaipei
* @Date: 2019/11/29 16:09
* @Version 1.0
*/
public class RedColour implements IColour {
@Override
public String tintage() {
return "被染成红色";
}
}
package com.geely.design.pattern.structural.bridge.wbp;
/**
* 给出实现化角色接口的具体实现
* @Author: wenbaipei
* @Date: 2019/11/29 16:08
* @Version 1.0
*/
public class YelloColour implements IColour {
@Override
public String tintage() {
return "被染成黄色";
}
}
测试类:
package com.geely.design.pattern.structural.bridge.wbp;
/**
* @Author: wenbaipei
* @Date: 2019/11/29 16:15
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
AFigure rectangleWithYello = new Rectangle(new YelloColour());
rectangleWithYello.generateFigureWithColour();
AFigure rectangleWithRed = new Rectangle(new RedColour());
rectangleWithRed.generateFigureWithColour();
AFigure cycleWithYellow = new Cycle(new YelloColour());
cycleWithYellow.generateFigureWithColour();
AFigure cycleWithRed = new Cycle(new RedColour());
cycleWithRed.generateFigureWithColour();
}
}
结果:
图片.png
网友评论