桥梁模式
将抽象部分与实现部分分离,使得他们两部分可以独立的变化。
有这样一个例子:我们希望可以在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);
}
访问者模式使增加新的操作变得容易,他可以收集有关联的方法,而分离没有关联的方法,特别适用于分离因为不同原因而变化的事物。
桥梁模式和访问者模式的区别
通过上述两种模式的示例,不难发现这一点。他们都通过将对象传入另一个对象中,完成两个对象结合使用完成功能的目的。
不同的是:访问者更多凸显的是将行为抽象出来,实现行为与数据的结合。而桥梁模式并没有凸显这一点。两种设计模式所属的类别无疑是原因之一。