桥接模式
定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
角色:
Abstraction:抽象类
RefinedAbstraction:扩充抽象类
Implementor:实现类接口
ConcreteImplementor:具体实现类
类图:
桥接模式分为两层:抽象层,实现层。
举个栗子:有两个披萨店生产披萨,一个为在北京,另一个在伦敦同时两个pizza店都生产两种pizza分别为GreekPizza和MealPizza。此时产品分为了两个维度。
**抽象层、实现层的判断:**此时的抽象层就是地区(北京,伦敦),实现层就是Pizza(GreekPizza、MealPizza)。可以根据两个维度的叫法先后来判断抽象层以及实现层。例如北京MealPizza,那么地区就作为抽象层,还有一个理解就是,更加具体的实体为Pizza因此Pizza就为实现层。
代码实现:
抽象层
package bridge;
public abstract class Bridge {
Pizza pizza;
Bridge(Pizza pizza){
this.pizza=pizza;
}
public void choosePizza(){
this.pizza.prepare();
this.pizza.cut();
}
}
===========================华丽分割线================================
package bridge;
public class BJBridge extends Bridge {
BJBridge(Pizza pizza) {
super(pizza);
}
@Override
public void choosePizza() {
super.choosePizza();
}
}
===========================华丽分割线================================
package bridge;
public class LDBridge extends Bridge {
LDBridge(Pizza pizza) {
super(pizza);
}
@Override
public void choosePizza() {
super.choosePizza();
}
}
实现层
package bridge;
public abstract class Pizza {
public abstract void prepare();
public void cut(){
System.out.println(this.getClass()+"pizza cut");
}
}
===========================华丽分割线================================
package bridge;
public class GreekPizza extends Pizza{
@Override
public void prepare() {
System.out.println("GreekPizza prepare!");
}
@Override
public void cut() {
super.cut();
}
}
===========================华丽分割线================================
package bridge;
public class MealPizza extends Pizza{
@Override
public void prepare() {
System.out.println("MealPizza Prepare");
}
@Override
public void cut() {
super.cut();
}
}
客户端
package bridge;
/**
* 产品分为北京和伦敦两种地区披萨,然后在北京pizza下边有两种GreekPizza and MealPizza
* 共分为两个维度 地区层为抽象层,实现层为Pizza
*/
public class Clint {
public static void main(String[] args) {
//创建父类对象,子类进行初始化
Pizza p = new GreekPizza();
Bridge bjBridge = new BJBridge(p);
bjBridge.choosePizza();
}
}
代码流程:
创建Bridge对象,并且传入Pizza进行初始化,通过bridge调用其choose方法方法内部由传入的pizza对象调用不同的pizza操作。
看完我写的工厂方法之后发现,这两个逻辑很相似,都是两个维度。但是通过两个相同的例子进行实现可以发现:工厂方法目的是创建对象,而桥接模式是如何将类或者对 象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。