定义 :访问者模式(Visitor)
表示一个作用于某个对象结构的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。
在不改变类的情况下给不通类赋上新属性。
类图
代码
人类抽象类和实现类
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