桥接模式属于结构型模式
它用于把抽象和实现解耦,使他们可以相对独立地变化。
适用于一个实现,需要对应多个变化的抽象维度。
核心在于使用组合的方式来解决继承的问题。
避免出现像笛卡尔积那样数量庞大的类个数。
场景
比如说吃饭,吃和喝是两个独立变化的维度。
它们都可以有各自的实现类。
如果要使用继承的方式来解决一顿晚餐的话,
需要炸鸡继承啤酒beer,然后dinner再继承炸鸡chicken,
或者香肠继承啤酒beer,然后dinner再继承香肠sausage,
这就是两个类了,如果有m种吃的和n种喝的,
那一共会产生m*n个类。
实例
这是喝的维度
饮料接口Drink
package com.superv.resource.design.bridge;
/**
* @author yangwei
* @describition 饮料
*
*/
public interface Drink {
/**
* 喝
*/
public void drink();
}
饮料的实现类啤酒Beer
package com.superv.resource.design.bridge;
/**
* @author yangwei
* @describition 啤酒,也可以有其它饮料,比如绿茶等等。
*
*/
public class Beer implements Drink {
@Override
public void drink() {
// TODO Auto-generated method stub
System.out.println("喝着啤酒");
}
}
这是吃的维度
食物抽象类Food
我们说的桥接就是这儿,在Food抽象类中引入了Drink接口的对象。
package com.superv.resource.design.bridge;
/**
* @author yangwei
* @describition 食物
*
* bridge,这个就是桥接模式中的桥的体现
*
*
*/
public abstract class Food {
/**
* 吃
*/
public abstract void eat(); // abstract不能像interface那样可以省略,要么就得添加方法实现
protected Drink drink; // 这里我使用protected的原因,如果是private且没有getter和setter的话会有警告
public Food (Drink drink) {
this.drink = drink;
}
}
晚餐Dinner
package com.superv.resource.design.bridge;
/**
* @author yangwei
* @describition 晚餐
*
*/
public class Dinner extends Food {
public Dinner(Drink drink) {
super(drink);
// TODO Auto-generated constructor stub
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃着炸鸡"); // 不喜欢吃的可以换成别的
drink.drink();
}
/**
* 往下是测试部分
* @param args
*/
public static void main(String[] args) {
Dinner dinner = new Dinner(new Beer());
dinner.eat();
}
}