访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式Demo:
/**
* 2018年4月11日下午9:04:54
*/
package com.Designpattern;
import java.util.ArrayList;
import java.util.List;
/**
* @author xinwenfeng
*
*/
public class TestVisitor {
/**
* @param args
*/
public static void main(String[] args) {
MyAnimalVisitor dog = new DogVisitor();
MyAnimalVisitor flittermouse = new FlittermouseVisitor();
ObjectStructure os = new ObjectStructure();
os.addStatus(new DayTime());
os.addStatus(new NightTime());
os.show(dog);
os.show(flittermouse);
}
}
interface Status{//只有白天和黑夜,确定并且不会改变
void showStatus(MyAnimalVisitor visitor);
}
interface MyAnimalVisitor{//可以有很多种实现
void dayStatus(Status status);
void nightStatus(Status status);
}
class DogVisitor implements MyAnimalVisitor{
@Override
public void dayStatus(Status status) {
System.out.println(status.getClass().getSimpleName()+":狗出门溜达。");
}
@Override
public void nightStatus(Status status) {
System.out.println(status.getClass().getSimpleName()+":狗睡狗窝。");
}
}
class FlittermouseVisitor implements MyAnimalVisitor{
@Override
public void dayStatus(Status status) {
System.out.println(status.getClass().getSimpleName()+":蝙蝠住山洞。");
}
@Override
public void nightStatus(Status status) {
System.out.println(status.getClass().getSimpleName()+":蝙蝠觅食。");
}
}
class DayTime implements Status{
@Override
public void showStatus(MyAnimalVisitor visitor) {
visitor.dayStatus(this);
}
}
class NightTime implements Status{
@Override
public void showStatus(MyAnimalVisitor visitor) {
visitor.nightStatus(this);
}
}
//对象结构
class ObjectStructure{
private List<Status> status = new ArrayList<>();
public void addStatus(Status s) {
status.add(s);
}
public void removeStatus(Status s) {
status.remove(s);
}
public void show(MyAnimalVisitor v) {
for(Status s:status) {
s.showStatus(v);
}
}
}
结果: