桥梁模式
将抽象部分与实现部分分离,使得他们两部分可以独立的变化。
有这样一个例子:我们希望可以在windows和Linux下都可以查看BMP、JPEG、GIF类型文件。纯粹的继承就需要2*3个子类而桥梁模式只需要2+3个子类。减少了子类的个数
/** * 图像实现类接口 */ public interface ImageImp{ // TODO } /** * 具体实现类 */ public class Winimp implements ImageImp { // TODO } public class Unix implements ImageImp { // TODO }
/** * 抽象image类型,包含ImageImp接口引用 * @author jiahua * */ public abstract class Image{ protected ImageImp imp; public Image(ImageImp image) { imp = image; } public abstract void Method(); }
/** * 实现类 */ public class BMPImage extends Image{ @Override public void Method() { // 通过抽象父类的setImageImp方法获取操作系统ImageImp类, //结合自己BMP图像实现类,完成具体方法 } }
public static void main(String[] args) { BMPImage bmp = new BMPImage(); // 具体图像类 ImageImp winimp = new Winimp(); //具体系统类 bmp.setImageImp(winimp); //注入 bmp.Method(); //实现图像和系统功能的方法 }桥梁模式可以从接口中分离实现功能,使设计更具扩展性
访问者模式
访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式。
下面看一个例子,当车出问题,维修工程师要检查车辆的发动机、车身、轮胎之中一个或多个。
每一个稳定组件对象都包含一个可以让访问者(维修工人)访问的入口,当访问者进入后,在访问者众多的方法中选择一个适合该被访问者的方法,达到区别对待的目的。
/** * 访问者 * @author jiahua * */ public interface Visitor{ void visit(Body body); // 检查车身 void visit(Wheel wheel); // 检查轮胎 void visit(Engine engine); // 发动机 }
/** * 接受访问的方法 * @author jiahua * */ public class Wheel{ void accept(Visitor visitor) { visitor.visit(this); } } public class Body{ void accept(Visitor visitor) { visitor.visit(this); } } public class Engine{ void accept(Visitor visitor) { visitor.visit(this); } }
/** * 具体访问者 * @author jiahua * */ public class engineer implements Visitor{ @Override public void visit(Body body) { // TODO Auto-generated method stub } @Override public void visit(Wheel wheel) { // TODO Auto-generated method stub } @Override public void visit(Engine engine) { // TODO Auto-generated method stub } }
public static void main(String[] args) { Wheel wheel = new Wheel(); Visitor visitor = new engineer(); wheel.accept(visitor); }访问者模式使增加新的操作变得容易,他可以收集有关联的方法,而分离没有关联的方法,特别适用于分离因为不同原因而变化的事物。
桥梁模式和访问者模式的区别
通过上述两种模式的示例,不难发现这一点。他们都通过将对象传入另一个对象中,完成两个对象结合使用完成功能的目的。
不同的是:访问者更多凸显的是将行为抽象出来,实现行为与数据的结合。而桥梁模式并没有凸显这一点。两种设计模式所属的类别无疑是原因之一。