结构型模式之桥接

Posted Judy518

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式之桥接相关的知识,希望对你有一定的参考价值。

GOF对桥接模式(Bridge)的定义是:将抽象部分和它的实现部分分离,使它们可以独立地变化。这里需要记录一些概念,参考自《Java与模式》一书:

抽象化:存在于多个实体中的共同的概念性联系,例如:一组对象如果有相同的概念性联系,则可以用一个共同的类加以描述;如果一些类有相同的概念性联系,则可以用一个抽象类加以描述。

实现化:就是给出抽象化的具体实现,例如:一个对象是一个类的实现化;一个具体类可以是一个抽象类的实现化。

脱耦:耦合是两个实体具有某种强关联关系,将这种强关联关系去掉就是解耦的过程。所谓强关联是在编译时期就已经确定好了关系,例如:继承就是一种强关联关系;而弱关联关系则是在运行期间可以动态地改变关联状态,类的组合关系就是一种若关联关系,这在Java编程中是最常用的一种关系。

 理解GOF所下定义的关键是搞明白“抽象” 和“实现”的含义,这里的抽象说白了就是指一个类及其子类,而“实现”是抽象类及其子类实现自己所用的对象,这句话用汉语说比较困难,请看《Design Patterns Explained》作者的表述:Implementations here means the objects that the abstract class and its derivations use to implement themselves with,这就是“实现”   的含义。比如:有一个图形的抽象类Shape,Shape有相应的子类,比如Rectange类,要实现一个Rectange对象,当然需要Draw方法,如果将Draw方法定义到Shape类中,那么每个继承自Shape类的子类都要自定义自己的Draw()方法,岂不是很麻烦,但是,如果将Draw()方法提炼出来单独放到一个类中(也就是Implementor)中,然后让Shape子类去调用对应的Draw()方法岂不是更妙,这样添加Shape子类就不用再在自己的类中添加Draw()方法了,而是调用相应的ConcreteImplementor中的Draw()方法,下面第一个图是Bridge模式的结构图,第二个图是《Design Patterns Explained》一书中所举画图例子的Bridge模式设计图

图1. Bridge模式结构图

图2. Bridge模式画图设计图

画图举例代码如下:

abstract class Shape{
	private Drawing drawing;
	public Shape(Drawing drawing){
		this.drawing=drawing;
	}
	public void Draw(){
		drawing.drawLine();
	}
}
class Rectange extends Shape{
	public Rectange(Drawing drawing){
		super(drawing);
	}
}
abstract class Drawing{
	public void drawLine(){};
	public void drawCircle(){};
}
class V1Drawing extends Drawing{
	public void drawLine(){
		System.out.println("Drawing Lines");
	}
	public void drawCircle(){
		System.out.println("Drawing Circles");
	}
}  

《Java与模式》一书还举例一个应用的例子,就是JDBC驱动器的实现利用的是桥梁模式

 

以上是关于结构型模式之桥接的主要内容,如果未能解决你的问题,请参考以下文章

JAVA SCRIPT设计模式--结构型--设计模式之Bridge桥接模式

结构型模式之桥接模式

6 结构型模式之 - 桥接模式

设计模式——结构型模式之桥接模式

设计模式之桥接模式

结构型设计模式 之 桥接模式