桥接模式--Bridge
摘要
本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了桥接模式的原理及应用。本文可帮助读者快速掌握桥接模式,以便工作学习中使用桥接模式。
一、桥接模式
在我们的生活中,一个物体所拥有的功能常常是多样的,比如厨师Tom会做红烧鱼,会做狮子头,而他两年之后又会做小龙虾,所以厨师Tom的烹饪功能在不断的变化。
程序如同生活,一个对象拥有的方法也是不断变化的,现要实现厨师Tom类的cooking()方法,需要实现红烧鱼方法、狮子头方法,两年之后还要重构厨师Tom类,增加小龙虾方法。由此可见违背了“开闭原则”。同时,若需要一个厨师Damon,他也会做红烧鱼、狮子头、小龙虾,那么又得拷贝一份代码,这样我们的代码重用性很低。
桥接模式为上面的问题提供了一种解决方式。桥接模式将抽象行为和具体实行进行分离,需要时进行组装即可。对于如上问题,将厨师Tom会的具体烹饪方法分离出来单独成立一个红烧鱼类、狮子头类、小龙虾类。由此可见厨师Tom的烹饪方法增加,不会再去更改源代码,而是新扩展一个功能类,这样就达到了“开闭原则”。
二、桥接模式的实现
2.1 场景设计
现有KFC和麦当劳两家餐饮店,两家餐饮店都会做汉堡、薯条,汉堡又分为牛肉汉堡、鸡肉汉堡,薯条分为番茄薯条、辣薯条。
借鉴桥接模式的思想,将牛肉汉堡、鸡肉汉堡、番茄薯条、辣薯条都单独封装成类。若麦当劳制作牛肉汉堡时,只需要将牛肉汉堡类传给麦当劳类,并调用麦当劳类的通用方法cookingHamburger()即可,其他烹饪操作类似。
2.2 代码实现
2.2.1 Store 商店抽象类
package ft.patterns.bridge;
public abstract class Store {
private Chips chips;
private Humburger humburger;
public Store(Chips chips, Humburger humburger) {
this.chips = chips;
this.humburger = humburger;
}
public Chips getChips() {
return chips;
}
public void setChips(Chips chips) {
this.chips = chips;
}
public Humburger getHumburger() {
return humburger;
}
public void setHumburger(Humburger humburger) {
this.humburger = humburger;
}
public void humburgerCooking() {
humburger.humburgerCooking();
}
public void chipsCooking() {
chips.chipsCooking();
}
}
2.2.2 KFC 商店具体类KFC
package ft.patterns.bridge;
public class KFC extends Store{
public KFC(Humburger humburger, Chips chips) {
super(chips, humburger);
}
@Override
public void humburgerCooking() {
super.humburgerCooking();
}
@Override
public void chipsCooking() {
super.chipsCooking();
}
}
2.2.3 MCD 商店具体类MCD
package ft.patterns.bridge;
public class MCD extends Store{
public MCD(Chips chips, Humburger humburger) {
super(chips, humburger);
}
public void humburgerCooking() {
super.humburgerCooking();
}
public void chipsCooking() {
super.chipsCooking();
}
}
2.2.4 Chips 薯条抽象类
package ft.patterns.bridge;
public interface Chips {
void chipsCooking();
}
2.2.5 ChipsHot 薯条具体类
package ft.patterns.bridge;
public class ChipsHot implements Chips{
@Override
public void chipsCooking() {
System.out.println("I am hot chips.");
}
}
2.2.6 ChipsKetchup 薯条具体类
package ft.patterns.bridge;
public class ChipsKetchup implements Chips{
@Override
public void chipsCooking() {
System.out.println("I am ketchup chips.");
}
}
2.2.7 Hamburger 汉堡抽象类
package ft.patterns.bridge;
public interface Humburger {
void humburgerCooking();
}
2.2.8 HamburgerBeef 汉堡具体类
package ft.patterns.bridge;
public class HumburgerBeef implements Humburger{
@Override
public void humburgerCooking() {
System.out.println("I am beef humburger.");
}
}
2.2.9 HamburgerChicken 汉堡具体类
package ft.patterns.bridge;
public class HumburgerChicken implements Humburger{
@Override
public void humburgerCooking() {
System.out.println("I am chicken humburger.");
}
}
2.2.10 Main测试类
package ft.patterns.bridge;
public class Bridge {
public static void main(String[] args) {
Chips kfcChips = new ChipsHot();
Humburger kfcHumburger = new HumburgerBeef();
Store kfcStore = new KFC(kfcHumburger,kfcChips);
Chips mcdChips = new ChipsKetchup();
Humburger mcdHumburger = new HumburgerChicken();
Store mcdStore = new KFC(mcdHumburger,mcdChips);
kfcStore.chipsCooking();
kfcStore.humburgerCooking();
mcdStore.chipsCooking();
mcdStore.humburgerCooking();
}
}
2.2.11 测试结果
I am hot chips.
I am beef humburger.
I am ketchup chips.
I am chicken humburger.