目录
1.桥接模式
- 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。
- 这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
- 将抽象部分与实现部分分离,使它们都可以独立的变化
2.优缺点
优点:
- 1、抽象和实现的分离。
- 2、优秀的扩展能力。
- 3、实现细节对客户透明。
缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
3.关键角色
- 1.抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
- 2.扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
- 3.实现(Implementor):定义实现接口,提供基本操作的接口。
- 4.具体实现(Concrete Implementor):实现实现接口的具体类。
4.使用场景
- 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
5.实例解析
我们需要构建一个手机类,我们知道手机有很多品牌,苹果、华为等,从另外一个颜色维度,又有多种颜色,红、黄、蓝等~
- 1.创建抽象类-手机
使用abstract创建抽象类
java
/**
* 抽象类
*/
public abstract class Phone {
/**
* 通过组合的方式,来桥接其他行为
*/
protected Color color;
/**
* 手机的方法
*/
abstract public void run();
public void setColor(Color color) {
this.color = color;
}
}
为什么非要使用abstract呢?不使用也能继承啊?
- 大佬的回答 :通过定义抽象类,并要求具体子类实现其中的抽象方法,让桥接模式的使用具有良好的扩展性;使用抽象类是为了定义一组通用的接口规范,确保子类都遵循相同的接口
- 2.创建颜色接口
java
/**
* 抽象接口
*/
public interface Color {
void userColor();
}
- 3.实现颜色接口的具体实现类
java
/**
* 扩展抽象-具体的抽象实现类
*/
public class BlueColor implements Color{
@Override
public void userColor() {
System.out.println("蓝色~");
}
}
/**
* 扩展抽象-具体的抽象实现类
*/
public class RedColor implements Color {
@Override
public void userColor() {
System.out.println("红色~");
}
}
/**
* 扩展抽象-具体的抽象实现类
*/
public class YellowColor implements Color {
@Override
public void userColor() {
System.out.println("黄色~");
}
}
- 4.创建继承抽象类的具体类
通过构造器的方式,实现组合
java
/**
* 具体的实现类
*/
public class ApplePhone extends Phone {
/**
* 组合颜色
* @param color
*/
public ApplePhone(Color color) {
super.setColor(color);
}
@Override
public void run() {
color.userColor();
System.out.println("苹果手机");
}
}
/**
* 具体的实现类
*/
public class HWPhone extends Phone {
/**
* 组合颜色
*
* @param color
*/
public HWPhone(Color color) {
super.setColor(color);
}
@Override
public void run() {
color.userColor();
System.out.println("华为");
}
}
- 5.测试
java
public class Main {
public static void main(String[] args) {
HWPhone hwPhone = new HWPhone(new BlueColor());
hwPhone.run();
System.out.println("===============================");
ApplePhone applePhone = new ApplePhone(new RedColor());
applePhone.run();
}
}