桥接模式--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.

三、桥接模式的UML图

桥接模式UML类图

发布了21 篇原创文章 · 获赞 0 · 访问量 1826
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章