最近也在学习 设计模式, 感觉 用这种思想解决了 这个问题 却又来了那个问题。
访问者 模式中当被观察者的类型如果变动,势必要改动原有的相应的观察者代码 。
这个问题我想在 JAVA 中可以使用反射来改良它。
下面是相关代码。
package visitor; //被观察者接口 public interface Visitable { public void accept(Visitor vistor); }
定义两个被观察者
package visitor; //被 访问者A public class ObjectA implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } }
package visitor; //被 访问者B public class ObjectB implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } }
package visitor; //观察者接口 public interface Visitor { public void visit(Visitable v); }
自定义一个观察者 作为中心控制。
通过读取config 文件 中相应的类,对其进行相应的操作。(之前有模仿 SRPING 写过IOC , 有点类似)
package visitor; import java.util.ResourceBundle; public class MyVisitor implements Visitor { public void visit(Visitable v) { System.out.println("this is CenterControl Visitor Class:"+v.getClass().getName()); System.out.println("THEN we can use config"); System.out.println("-------------------------------------"); ResourceBundle rb = ResourceBundle.getBundle("config"); String clazzString = rb.getString(v.getClass().getName()); try { Visitor visitor= (Visitor) Class.forName(clazzString).newInstance(); //here truly do somthing for v visitor.visit(v); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
这里用了一个config.properties 文件
visitor.ObjectA=visitor.VisitorA visitor.ObjectB=visitor.VisitorB
观察者A
package visitor; public class VisitorA implements Visitor { public void visit(Visitable v) { System.out.println("this is Visitor : my name is " +this.getClass().getName()); System.out.println("Here I will do something for " + v.getClass().getName()); } }
观察者B
package visitor; public class VisitorA implements Visitor { public void visit(Visitable v) { System.out.println("this is Visitor : my name is " +this.getClass().getName()); System.out.println("Here I will do something form " + v.getClass().getName()); } }
好了。测试一下
public class TestVistorPattern { public static void main(String[] args) { Visitable obj = new ObjectA(); Visitor vistor = new MyVisitor(); obj.accept(vistor); } }
结果为
this is Class:visitor.ObjectA THEN we can use config this is Visitor : my name is visitor.VisitorA Here I will do something form visitor.ObjectA
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
QQ咨询|关于我们|Archiver|手机版|小黑屋|( 辽ICP备15012455号-4 ) Powered by 期权论坛 X3.2 © 2001-2016 期权工具网&期权论坛 Inc.
下载期权论坛手机APP