判断项目中是否存在类有两种甚至多余两种维度的需求。
将多个维度的需求抽离出来,抽离多个抽象类。
将抽象类定义,并且定义类继承,实现自己的方法。
定义另一个模式的抽象类,并且将第一个定义的抽象类作为对象传递进去。
定义上一步定义的类的具体类,并且将第一步定义的抽象类对象传入,调用具体的类的实现方法。
我们以下单功能为例子,一个订单类里面有两个维度,一个是订单的类型,机票订单和酒店订单,还有就是买保险和不买保险。
我们创建一个 net.haicoder.bridge
包,在该包下面创建 InsuranceResourceService.java
、BuyInsuranceResource.java
、NotBuyInsuranceResource.java
、 AbstractCreateOrder.java
、FlightCreateOrder.java
、HotelCreateOrder.java
和 TestMain.java
类文件。
文件创建完毕,目录结构如下图:
InsuranceResourceService.java
代码如下:
package net.haicoder.bridge;
public abstract class InsuranceResourceService {
public abstract void isBuyInsurance();
}
BuyInsuranceResource.java
代码如下:
package net.haicoder.bridge;
public class BuyInsuranceResource extends InsuranceResourceService {
public void isBuyInsurance() {
System.out.println("Yes , I need Insurance");
}
}
NotBuyInsuranceResource.java
代码如下:
package net.haicoder.bridge;
public class NotBuyInsuranceResource extends InsuranceResourceService {
public void isBuyInsurance() {
System.out.println("Sorry , I do not need Insurance");
}
}
AbstractCreateOrder.java
代码如下:
package net.haicoder.bridge;
public abstract class AbstractCreateOrder {
protected InsuranceResourceService insuranceResourceService;
public abstract void createOrder();
public void setInsuranceResourceService(InsuranceResourceService insuranceResourceService) {
this.insuranceResourceService = insuranceResourceService;
}
}
FlightCreateOrder.java
代码如下:
package net.haicoder.bridge;
public class FlightCreateOrder extends AbstractCreateOrder {
public void createOrder() {
insuranceResourceService.isBuyInsurance();
System.out.println("创建机票订单");
}
}
HotelCreateOrder.java
代码如下:
package net.haicoder.bridge;
public class HotelCreateOrder extends AbstractCreateOrder {
public void createOrder() {
insuranceResourceService.isBuyInsurance();
System.out.println("创建酒店订单");
}
}
TestMain.java
代码如下:
package net.haicoder.bridge;
public class TestMain {
public static void main(String[] args) {
System.out.println("海客网(www.haicoder.net)");
InsuranceResourceService buyInsurance = new BuyInsuranceResource();
AbstractCreateOrder createOrder = new FlightCreateOrder();
createOrder.setInsuranceResourceService(buyInsurance);
createOrder.createOrder();
System.out.println("=========华丽的分割线===========");
InsuranceResourceService notBuyInsurance = new NotBuyInsuranceResource();
AbstractCreateOrder hotelCreateOrder = new HotelCreateOrder();
hotelCreateOrder.setInsuranceResourceService(notBuyInsurance);
hotelCreateOrder.createOrder();
}
}
运行结果如下图:
桥接模式总结
设计模式中桥接模式在解决一个超类如果有两个甚至超过两个维度基础上,解决继承类爆炸的功能上面有很积极的作用,很巧妙的解决了多层继承存在的问题。