java设计模式——Bridge(桥接)模式

       假设你要设计一个系统,该系统可以根据选择,创造不同颜色的各种图形。在没有学习桥接模式前,我的想法一定会是在一个抽象类(比方说叫graph)下派生各种子类(比方说RedRectangle之类的)。虽然在设计时候会很简单,但是一来这会导致产生大量的子类。(比方说有m种图形,n种颜色,那就要有m*n个子类)二来会给代码阅读以及代码维护、功能扩展(比方说直接对graph做扩展)带来巨大的不便。
       因此很自然地想到,如果把图形(抽象)和颜色(产生实例)分开来写,这样就大大降低了类的数量。同时可以分别对这两者进行功能扩展而不互相影响

1、什么是桥接模式

桥接模式的定义:将抽象(类的功能层次结构)和实现(类的实现层次结构)分离,使它们可以独立变化。以组合关系代替了继承关系,降低了功能层次结构和实现按层次结构的耦合度。

       所谓桥接模式其实就是构建一个桥将图形的类型(类的功能层次结构)和颜色(类的实现层次结构)连接在一起。而要想了解桥接模式就要先了解这个桥连接的两端是什么。
下面引用《图形设计模式》里的解释
类的功能层次结构:
父类具有基本功能(这是一个什么图形)
在子类中添加新的功能(图形的边是弯曲的、图形的边是虚线的)

类的实现层次结构:
父类通过声明定义接口
子类通过实现具体方法来实现接口

2、角色定义

抽象功能:类的功能层次结构的最上层。(可以通过扩展新的功能来完善功能层次结构)
实现者:类的实现层次结构的最上层。
具体实现者:实现实现者中的各个接口。

3、代码呈现

以不同亚瑟的图形举例。
步骤一:创建实现者

interface Color{  
	String getColor();
}

步骤二:创建具体实现者

class Red implements Color{  实现接口功能
	public String getColor() {
		return "Red";
	}
}
class Orange implements Color{ 实现接口功能
	public String getColor() {
		return "Orange";
	}
}

步骤三:创建抽象功能

abstract class Shape{
	Color color;
	public void setColor(Color color) {  
		this.color = color;
	}
	public abstract String getName();
}

其中实现桥接的部分

Color color;
	public void setColor(Color color) {  
		this.color = color;
	}

步骤四:扩展抽象功能

class Rectangle extends Shape{  实现创建三角形功能
	public String getName() {
		return color.getColor()+"Rectangle";将颜色与图形对接
	}
}
class Circle extends Shape{     实现创建圆形功能
	public String getName() {
		return color.getColor()+"Circle";将颜色与图形对接
	}
}

测试

public class Bridge {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Red red = new Red();
		Orange orange = new Orange();
		
		Rectangle rectangle = new Rectangle();
		Circle circle = new Circle();
		
		rectangle.setColor(red);
		System.out.println(rectangle.getName());
		
		circle.setColor(orange);
		System.out.println(circle.getName());
	}

}
RedRectangle
OrangeCircle

4、总结

       桥接模式特别适用于一个类存在两个独立变化维度的情景,通过分离抽象功能与实现,能方便的扩展这两个维度的功能。但是设计难点也恰恰在于此,需要设计者能很好判断这个事物是否具有两个独立维度,以及是哪两个维度。桥接模式增加了理解与设计的难度。

你可能感兴趣的:(设计模式,java)