23个java设计模式(十六)-- 桥接模式

2016年03月23日 原创
关键词: java 设计模式
摘要 桥接模式将抽象部分与它的实现部分分离,使他们都可以独立地变化。

一、概述。

桥接模式将抽象部分与它的实现部分分离,使他们都可以独立地变化。

抽象类或接口中可以定义若干个抽象方法,习惯上将抽象方法称作操作。抽象类或接口使程序的设计者忽略操作的细节,即不必考虑这些操作是如何实现的,当用户程序面向抽象类或接口时,就不会依赖具体的实现,使系统有很好的扩展性。

桥接模式是关于怎样将抽象部分与它的实现部分分离,使他们都可以独立地变化的成熟模式。

二、桥接模式的结构。

桥接模式包括四种角色:

  • 抽象(Abstraction):是一个抽象类,该抽象类含有实现者声明的变量。
  • 实现者(Implementor):实现者角色是一个接口(抽象类),该接口(抽象类)中的方法不一定与Abstraction类中的方法一致。实现者负责定义基本操作,而Abstraction负责定义基于基本操作的较高层次的操作。
  • 细化抽象(Refined Abstraction):细化抽象是抽象角色的一个子类,该子类在重写抽象角色中的方法时,在给出一些必要的操作后,将委托所维护实现者对象调用相应的方法。
  • 具体实现者(Concrete Implementor):具体实现者是实现(扩展)实现者的类。

三、示例程序。

抽象(Abstraction)

ArchitectureCost.java

public abstract class ArchitectureCost {
	protected BuildingDesign design;
	protected double unitPrice;
	public abstract double giveCost();
}

实现者(Implementor)

BuildingDesign.java

public interface BuildingDesign {
	public double computeArea();
}

细化抽象(Refined Abstraction)

BuildingCost.java

public class BuildingCost extends ArchitectureCost{
	public BuildingCost(BuildingDesign design, double unitPrice) {
		this.design = design;
		this.unitPrice = unitPrice;
	}
	@Override
	public double giveCost() {
		double area = design.computeArea();
		return area*unitPrice;
	}

}

具体实现者(Concrete Implementor)

HouseDesign.java

public class HouseDesign implements BuildingDesign{
	private double width, length;
	private int floorNumber;
	
	public HouseDesign(double width, double length, int floorNumber) {
		this.width = width;
		this.length = length;
		this.floorNumber = floorNumber;
	}

	@Override
	public double computeArea() {
		return width * length * floorNumber;
	}
	
}

测试程序

public class Example1Test {
	@Test
	public void testMain() {
		double width = 63, height = 30;
		int floorNumber = 8;
		double unitPrice = 6867.38;
		BuildingDesign design = new HouseDesign(width, height, floorNumber);
		System.out.println("宽"+width+"米,高"+height+"米,层数为"+floorNumber);
		ArchitectureCost cost = new BuildingCost(design, unitPrice);
		double price = cost.giveCost();
		System.out.println("每平方米造价:"+unitPrice+"元的商业楼的建设成本:"+price);
		width = 52;
		height = 28;
		floorNumber = 6;
		unitPrice = 2687.88;
		design = new HouseDesign(width, height, floorNumber);
		System.out.println("宽"+width+"米,高"+height+"米,层数为"+floorNumber);
		cost = new BuildingCost(design, unitPrice);
		price = cost.giveCost();
		System.out.println("每平方米造价:"+unitPrice+"元的商业楼的建设成本:"+price);
	}
}

四、桥接模式的优点。

  1. 桥接模式分离实现与抽象,使抽象和实现可以独立的扩展。当修改实现的代码时,不影响抽象的代码,反之亦然。
  2. 满足“开-闭原则”。

五、适合桥接模式的情景。

  1. 不想让抽象和某些重要的实现代码是固定的绑定关系,这部分实现代码可以运行时动态决定。
  2. 抽象和实现者都可以用继承的方式独立地扩充而互不影响。