在生活中,有些类会有多个维度的变化。比如用作几何图工具。会有多种形状的:三角形、矩形、圆形;也会有多种颜色。在项目中类如这样的情况,一个类存在多个维度的变化。我们可以使用桥接模式。
桥接(Bridge)模式定义:将抽象与实现分离,使它们可以独立变化。
他是用组合关系代替继承关系来实现,从而降低了抽象与实现这两个可变维度的耦合度。
优点:
- 抽象与实现分离,扩展能力强。
- 符合开闭原则
- 符合合成复用原则
- 实现细节对客户端透明
桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则。
缺点:
- 要求开发者针对抽象化进行设计与编程,因为聚合关系建立在抽象层
- 需要分辨出系统中独立变化的维度,增加了系统的理解与设计的难度
桥接模式的结构与实现
结构:
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
实现:
实现场景:画图工具
package com.wly.DesignPatterns;
/**
* @program: StudyDome
* @author: yuanzhang
* @create: 2020-12-22 15:53
**/
public class BridgeStudy {
public static void main(String[] args) {
Color red = new Red();
Color green = new Green();
Graph rircle = new Circle(red);
Graph rectangle = new Rectangle(green);
System.out.println("来一个红色圆形");
System.out.println(rircle.getGraph());
System.out.println("来一个绿色矩形");
System.out.println(rectangle.getGraph());
System.out.println("来一个绿色圆形");
rircle.setColor(green);
System.out.println(rircle.getGraph());
System.out.println("来一个红色矩形");
rectangle.setColor(red);
System.out.println(rectangle.getGraph());
}
}
/**
* @Annotation:实现化角色---颜色
* @Author: yuanzhang
* @Date: 15:56
*/
interface Color{
String setColor();
}
/**
* @Annotation:具体实现化角色---红色
* @Author: yuanzhang
* @Date: 15:58
*/
class Red implements Color{
@Override
public String setColor() {
return "红色";
}
}
/**
* @Annotation:具体实现化角色---绿色
* @Author: yuanzhang
* @Date: 15:59
*/
class Green implements Color{
@Override
public String setColor() {
return "绿色";
}
}
/**
* @Annotation:抽象化角色---图形
* @Author: yuanzhang
* @Date: 15:59
*/
abstract class Graph{
protected Color color;
protected Graph(Color color){
this.color = color;
}
public abstract void setColor(Color color);
public abstract String getGraph();
}
/**
* @Annotation:扩展抽象化角色---圆形
* @Author: yuanzhang
* @Date: 16:03
*/
class Circle extends Graph{
protected Circle(Color color){
super(color);
}
@Override
public String getGraph() {
return color.setColor()+"圆形";
}
@Override
public void setColor(Color color) {
this.color = color;
}
}
/**
* @Annotation:扩展抽象化角色---矩形
* @Author: yuanzhang
* @Date: 16:04
*/
class Rectangle extends Graph{
protected Rectangle(Color color){
super(color);
}
@Override
public String getGraph() {
return color.setColor()+"矩形";
}
@Override
public void setColor(Color color) {
this.color = color;
}
}
输出:
来一个红色圆形 红色圆形 来一个绿色矩形 绿色矩形 来一个绿色圆形 绿色圆形 来一个红色矩形 红色矩形