访问者模式(Visitor)Java
2016-06-18
表示一个作用于某个对象结构的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。
在不改变类的情况下给不通类赋上新属性。
package ding.study.designpatterns.visitor; /** * 定义人对象的接口 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:28:05 */ public interface Person { public void showTime(Visitor visitor); public String getMessage(); } package ding.study.designpatterns.visitor; /** * 男人类 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:28:16 */ public class PersonNan implements Person { @Override public void showTime(Visitor visitor) { visitor.getVersion(this); } @Override public String getMessage() { return "男人"; } } package ding.study.designpatterns.visitor; /** * 女人类 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:28:27 */ public class PersonNv implements Person { @Override public void showTime(Visitor visitor) { visitor.getVersion(this); } @Override public String getMessage() { //System.out.println("女人撒尿"); return "女人"; } }
package ding.study.designpatterns.visitor; /** * 观察者 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:28:38 */ public interface Visitor { public void getVersion(Person person); }
package ding.study.designpatterns.visitor; /** * 观察人撒尿 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:28:47 */ public class VisitorSaNiao implements Visitor { @Override public void getVersion(Person person) { if(person instanceof PersonNan){ System.out.println( person.getMessage()+"站着"); } if(person instanceof PersonNv){ System.out.println( person.getMessage()+"蹲着"); } } }
</pre><pre code_snippet_id="1720803" snippet_file_name="blog_20160618_5_137570" name="code" class="html">package ding.study.designpatterns.visitor; /** * 观察人撒泼 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:28:58 */ public class VisitorSaPo implements Visitor { <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void getVersion(Person person) { <span style="white-space:pre"> </span> if(person instanceof PersonNan){ <span style="white-space:pre"> </span>System.out.println( person.getMessage()+"撒泼 -打人"); <span style="white-space:pre"> </span> } <span style="white-space:pre"> </span> if(person instanceof PersonNv){ <span style="white-space:pre"> </span>System.out.println( person.getMessage()+"撒泼-哭"); <span style="white-space:pre"> </span> } <span style="white-space:pre"> </span>} }
package ding.study.designpatterns.visitor; import java.util.ArrayList; import java.util.List; /** * 观察person的集合类 * @author daniel * @email 576699909@qq.com * @time 2016-5-11 下午2:27:03 */ public class PersonVisitorTools { /** * PerSon集合 */ private List<Person> elements=new ArrayList<Person>(); /** * 添加人对象 * @param element */ public void add(Person element){ elements.add(element); } /** * 杀人 * @param element */ public void delete(Person element){ elements.remove(element); } /** * 排队报数 访问状态下 人的反应 * @param visitor */ public void show(Visitor visitor) { for (Person e : elements) { e.showTime(visitor); } } }
package ding.study.designpatterns.visitor; /** * 访问者模式:(Visitor),表示一个作用于某个对象结构的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。 * * * * @author daniel * @email 576699909@qq.com * @time 2016-6-18 下午4:37:01 */ public class ZMainTest { /** * @author daniel * @time 2016-5-11 下午2:30:19 * @param args */ public static void main(String[] args) { /** * 观察者集合 */ PersonVisitorTools tools = new PersonVisitorTools(); tools.add(new PersonNan()); tools.add(new PersonNv()); // 观察人去洗手间 Visitor visitor = new VisitorSaNiao(); tools.show(visitor); // 观察人发飙 visitor = new VisitorSaPo(); tools.show(visitor); } }
男人站着 女人蹲着 男人撒泼 -打人 女人撒泼-哭
新增Visitor实现类就可以不修改person实现类增加person实现类的新特性
例如:新增success状态和error状态
https://github.com/dingsai88/StudyTest/tree/master/src/ding/study/designpatterns/visitor