大家好,我是馆长!今天开始我们讲的是结构型模式中的桥接模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式,共7种设计模式。
桥接模式(Bridge Pattern)
定义
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。
解决问题
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
实现
可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
结构
主要角色如下:
1.抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
2.扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。可以是抽象类的子类或具体实现类。
3.实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
4.具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
注意:
1、抽象化角色是抽象类(abstract class),包含实现化引用。
2、对于两个独立变化的维度或者多维度的变化,使用桥接模式再适合不过了。
优点:
由于抽象与实现分离,所以扩展能力强。
其实现细节对客户透明。
缺点:
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
适用场景:
1、当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
2、当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
3、当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
代码实现:
//抽象化角色:Shape
@Data
public abstract class Shape {
protected Color color;
Shape() {}
Shape(Color color) {
this.color = color;
}
//绘制图形
abstract void draw();
}
//扩展抽象化角色:Circular
@Data
public class Circular extends Shape {
Circular(Color color) {
super(color);
}
@Override
void draw() {
System.out.println("绘制圆形:");
color.fill();
}
}
//扩展抽象化角色:Circular
@Data
public class Rectangle extends Shape {
Rectangle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println("绘制矩形:");
color.fill();
}
}
//实现抽象类:颜色填充 Color
public interface Color {
void fill();
}
//具体实现化角色:RedColor
@Data
public class RedColor implements Color {
@Override
public void fill() {
System.out.println("填充了红色");
}
}
//具体实现化角色:RedColor
@Data
public class BlueColor implements Color {
@Override
public void fill() {
System.out.println("填充了蓝色");
}
}
//模拟客户端
public class ClientDemo {
public static void main(String[] args) {
Shape circularRed = new Circular(new RedColor());
circularRed.draw();
Shape circularBlue = new Circular(new BlueColor());
circularBlue.draw();
Shape rectangleRed = new Rectangle(new RedColor());
rectangleRed.draw();
Shape rectangleBlue = new Rectangle(new BlueColor());
rectangleBlue.draw();
}
}
扩展:
在软件开发中,有时桥接(Bridge)模式可与适配器模式联合使用。当桥接(Bridge)模式的实现化角色的接口与现有类的接口不一致时,可以在二者中间定义一个适配器将二者连接起来,
好了,关于桥接模式的说明,馆长就先讲到这里。谢谢各位看官!!
23 种设计模式不是孤立存在的,很多模式之间存在一定的关联关系,在大的系统开发中常常同时使用多种设计模式,或者模式与模式之间的组合进行生成更加强大的程序功能。