桥接模式(Bridge Pattern)是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多重继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效地控制了系统中类的个数。
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响
抽象类
public abstract class Pen { protected Color color; public void setColor(Color color) { this.color = color; } public abstract void draw(String name); }
细化抽象类
public class BigPen extends Pen { @Override public void draw(String name) { String penType = "大号毛笔绘制"; this.color.bepaint(penType,name); } }
public class MiddlePen extends Pen { @Override public void draw(String name) { String penType = "中号毛笔绘制"; this.color.bepaint(penType,name); } }
public class SmallPen extends Pen { @Override public void draw(String name) { String penType = "小号毛笔绘制"; this.color.bepaint(penType,name); } }
接口
public interface Color { //用于图形着色的方法 void bepaint(String penType,String name); }
接口实现类
public class Red implements Color { @Override public void bepaint(String penType, String name) { System.out.println(penType+"红色的"+name+"."); } } public class White implements Color { @Override public void bepaint(String penType, String name) { System.out.println(penType+"白色的"+name+"."); } } public class Green implements Color { @Override public void bepaint(String penType, String name) { System.out.println(penType+"绿色的"+name+"."); } } public class Blue implements Color { @Override public void bepaint(String penType, String name) { System.out.println(penType+"蓝色的"+name+"."); } } public class Black implements Color { @Override public void bepaint(String penType, String name) { System.out.println(penType+"黑色的"+name+"."); } }
客户类
public class Client { public static void main(String[] args) { Color color; Pen pen; color = (Color) XMLUtilPen.getBean("color"); pen = (Pen) XMLUtilPen.getBean("pen"); pen.setColor(color); pen.draw("鲜花"); } }
实现结果
桥接模式与适配器模式经常联合使用,适配器模式可以解决两个已有接口间不兼容的问题,适配器采用增加适配器的方式将第三方类集成到系统中;而桥接模式则通过接口继承或者类继承的方式对系统进行扩展。两个模式用于设计的不同阶段,通常情况下桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化。初步设计完成后,当发现系统与已有类无法协同工作时,可以采用适配器模式。