桥梁模式和访问者模式

桥梁模式

将抽象部分与实现部分分离,使得他们两部分可以独立的变化。

有这样一个例子:我们希望可以在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);
		
	 }
访问者模式使增加新的操作变得容易,他可以收集有关联的方法,而分离没有关联的方法,特别适用于分离因为不同原因而变化的事物。

桥梁模式和访问者模式的区别

通过上述两种模式的示例,不难发现这一点。他们都通过将对象传入另一个对象中,完成两个对象结合使用完成功能的目的。

不同的是:访问者更多凸显的是将行为抽象出来,实现行为与数据的结合。而桥梁模式并没有凸显这一点。两种设计模式所属的类别无疑是原因之一。


猜你喜欢

转载自blog.csdn.net/qq_38500786/article/details/80444175