桥接模式
桥接模式(Bridge Pattern)将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式有助于减少类的数量,因为它将一个类层次结构中的两个维度(例如,抽象和实现)解耦,使得两者可以独立地扩展。
桥接(Bridge)模式包含以下主要角色:
- 系统设计期间,如果这个类里面的一些东西,会扩展很多,这个东西就应该分离出来
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
案例
现在我们需要销售手机,但不同的手机品牌会有不同的销售渠道,我们需要将销售渠道从手机类中分离出来:
抽象手机类:
java
public abstract class AbstractPhone {
AbstractSale sale;
public void setSale(AbstractSale sale){
this.sale = sale;
}
public abstract void getPhone();
}
抽象销售渠道类:
java
public class AbstractSale {
String type;
String price;
public AbstractSale(String type,String price){
this.price = price;
this.type = type;
}
public String getSaleInfo(){
return "销售渠道:"+this.type + ",销售价格:"+this.price;
}
}
手机实现类:
java
public class Iphone extends AbstractPhone{
@Override
public void getPhone() {
System.out.println(sale.getSaleInfo());
}
}
java
public class MiPhone extends AbstractPhone{
@Override
public void getPhone() {
System.out.println(sale.getSaleInfo());
}
}
不同的销售渠道:
java
public class OffSale extends AbstractSale{
public OffSale(String type, String price) {
super(type, price);
}
}
java
public class OnSale extends AbstractSale{
public OnSale(String type, String price) {
super(type, price);
}
}
测试:
java
public class Main {
public static void main(String[] args) {
Iphone iphone = new Iphone();
iphone.setSale(new OffSale("线下","9999"));
iphone.getPhone();
MiPhone miPhone = new MiPhone();
miPhone.setSale(new OnSale("线上","1999"));
miPhone.getPhone();
}
}
使用场景用:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。