赞
踩
将抽象部分与它的实现部分解耦,使得两者都能够独立变化。通俗地讲,就是将多层继承转化为两个横向维度。
好比如:一个电脑下有苹果品牌,戴尔品牌,联想品牌,各个品牌下又有台式机或笔记本等等。对于这样的多层继承关系,使用抽象关联来取代再合适不过了(桥接)。
(1)Abstraction(抽象类):其中定义了一个Implementor类型的对象,并可以维护该对象。
(2)RefinedAbstraction(扩充抽象类):继承Abstraction,可以调用在Implementor中定义的业务方法。
(3)Implementor(实现类接口):Implementor提供基本操作,而Abstraction定义的可能会做更复杂的操作。
(4)ConcreteImplementor(具体实现类):实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现。运行时,将替代其父类对象,提供给抽象类具体的业务操作方法。
interface Implementor{
public void f1();
}
public class ConcreteImplementor implements Implementor{
public void f1(){
//具体业务处理
}
}
(2)Abstraction和RefinedAbstraction:
public abstract Abstraction {
protected Implementor i;
public void setImpl(Implementor i){
this.i=i;
}
//声明抽象类方法
public abstract void f1();
}
public class RefinedAbstraction extends Abstraction{
public abstract void f1(){
//调用实现类方法
i.f1();
}
}
(1)多层继承,图像浏览系统->(Window,Linux,Unix)->(BMP,JPG,GIF,PNG)。
(2)把操作系统抽象的划分为Implementor,各个操作系统分别实现Implementor。
(3)把图片类型抽象划分为Abstraction,各个图片类型分别继承Abstraction。
类图
代码实现
(1)SysImpl(系统类型抽象类)和各个系统具体类(Window,Linux,Unix):
interface SysImpl { //显示矩阵像素 public void doPrint(); } class Linux implements SysImpl { @Override public void doPrint() { System.out.println("在Linux中显示图像:"); } } class Unix implements SysImpl { @Override public void doPrint() { System.out.println("在Unix中显示图像:"); } } class Win implements SysImpl { @Override public void doPrint() { System.out.println("在window中显示图像:"); } }
(2)ImageAbs(图片类型抽象类)和各个图片类型具体类(BMP,JPG,GIF,PNG):
abstract class ImageAbs { protected SysImpl sys; public void setSysImpl(SysImpl sys){ this.sys=sys; } public abstract void parseFile(String fileName); } class BMP extends ImageAbs { @Override public void parseFile(String fileName) { sys.doPrint(); System.out.println(fileName+"图片格式为:BMP"); } } class GIF extends ImageAbs { @Override public void parseFile(String fileName) { sys.doPrint(); System.out.println(fileName+"图片的格式为:GIF"); } } class JPG extends ImageAbs { @Override public void parseFile(String fileName) { sys.doPrint(); System.out.println(fileName+"图片的格式为:JPG"); } } class PNG extends ImageAbs { @Override public void parseFile(String fileName) { sys.doPrint(); System.out.println(fileName+"图片的格式为:PNG"); } }
(1)将代码的抽象部分与实现部分进行分离,使得两者能够独立变化。
(2)抽象类定义了一个实现类接口类型的对象并维护该对象。
(1) 如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
(2)一个类存在两个(或多个)独立变化的维度,且这两个维度都需要独立进行扩展。
(3)对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。