2018.4.24 设计模式之桥接模式
设计模式之桥接模式
1定义/概念
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
2.思考何时使用
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
3.实现的方式
1、定义一个桥接口,使其与一方绑定,这一方的扩展全部使用实现桥接口的方式。
2、定义一个抽象类,来表示另一方,在这个抽象类内部要引入桥接口,而这一方的扩展全部使用继承该抽象类的方式。
4.模式中的角色和职责
1.Client 调用端
这是Bridge模式的调用者。
2.抽象类(Abstraction)
抽象类接口(接口这货抽象类)维护队行为实现(implementation)的引用。它的角色就是桥接类。
3.Refined Abstraction
这是Abstraction的子类。
4.Implementor
行为实现类接口(Abstraction接口定义了基于Implementor接口的更高层次的操作)
5.ConcreteImplementor
Implementor的子类
5.例子讲解
package com.glut.demo12;
/**
* 定义桥接类Abstraction,
* 其中有对Implementor接口的引用
*
* @author qichunlin
*
*/
public abstract class Abstraction {
private Implementor implementor;
//get set 方法
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public Implementor getImplementor(){
return implementor;
}
protected void operation(){
implementor.operation();
}
}
package com.glut.demo12;
/**
* 定义了Implementor接口的两个实现类
*
* @author qichunlin
*
*/
public class ConcreteImplementorA implements Implementor{
@Override
public void operation() {
System.out.println("This is ConcretetorA's operation...");
}
}
package com.glut.demo12;
/**
* 定义了Implementor接口的两个实现类
*
* @author qichunlin
*
*/
public class ConcreteImplementorB implements Implementor{
@Override
public void operation() {
System.out.println("This is ConcretetorB's operation...");
}
}
package com.glut.demo12;
/**
* 首先定义Implementor 接口,其中定义了
* 其实现类必须要的的实现的接口operation
*
* @author qichunlin
*
*/
public interface Implementor {
public void operation();
}
package com.glut.demo12;
/**
* Abstract 类的子类RefineAbstract
*
* @author qichunlin
*
*/
public class RefineAbstract extends Abstraction{
@Override
protected void operation(){
super.getImplementor().operation();
}
}
package com.glut.demo12;
/**
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
Abstraction abstraction = new RefineAbstract();
//调用第一个实现类
abstraction.setImplementor(new ConcreteImplementorA());
abstraction.operation();
//调用第二个实现类
abstraction.setImplementor(new ConcreteImplementorB());
abstraction.operation();
}
}
6.桥接模式的优缺点
优点
(1)实现了抽象和实现部分的分离
桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现独立开来,分别定义接口,有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
(2)更好的拓展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就是使得抽象部分和实现部分分别独立扩展,而不会相互影响,大大的提供了系统的可拓展性。
(3)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
(4)实现细节对客户端的透明,可以对用户隐藏细节
缺点
(1)桥接模式的引入增加了系统的可理解好设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
(2)桥接模式要求正确识别系统中两个独立变化的维度,因此其使用范围有一定的局限性。
7.桥接模式的使用场景
(1)如果一个系统需要在构件的抽象化角色和具体角色之间增加更多的了灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
(2)抽象化角色和实现化角色可以继承的方法的独立扩展而互不影响。在程序运行时可以动态将一个抽象化子类的对象和一个是鲜花子类的对象进行组合,即系统需要抽象化角色和实例化角色进行动态耦合。
(3)一个类存在两个独立变化的维度,且这两个维度都需要扩展。
(4)虽然在系统中使用继承时没有问题的,但是由于抽象化角色和具体角色需要独立变化,设计要求需要独立管理这两者。
(5)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
这样,通过对Abstraction桥接类的调用,实现了对接口Implementor的实现类ConcreteImplementorA和ConcreteImplementorB的调用。实现了抽象与行为实现的分离。