资料:
(1)设计模式读书笔记-----访问者模式:
https://blog.csdn.net/chenssy/article/details/12029633
访问者模式的特点:
访问者模式把数据结构(例如List)和作用于结构上的操作(例如remove())解耦合,使得操作集合可相对自由地演化。
我的心得:
如果元素类和访问者类约定好方法
MyElement.accept1(IVisitor v)对应IVisitor.visit1(MyElement e),则visit1对应功能1。
MyElement.accept2(IVisitor v)对应IVisitor.visit2(MyElement e),则visit2对应功能2。
...以此类推,这样,元素类就通过IVisitor拥有了许多功能。
元素类:
public class MyElement {
private Object value;
private Integer type;
public MyElement(Integer type,Object value){
this.type = type;
this.value = value;
}
//正常情况下,为了给元素添加方法,我们会直接将方法写死在元素类里,这样不通用,代码也不优美。
//解决方法:写一个方法accept,参数注入一个实现了接口IVisitor的实现类对象,
//所有对元素的操作都写在IVisitor的实现类里,这样就不会写死了。
public void accept(IVisitor visitor){
//让元素 亲自 执行 这些被visitor加工过的代码visit
visitor.visit(this);
}
//set...get
}
访问者接口类
public interface IVisitor {
public void visit(MyElement e);
}
访问者类
public class MyVisitor implements IVisitor{
//对元素的方法进行加工,然后再将该被加工的方法,给元素的方法(accept)接收,让元素通过调用accept方法,来亲自来执行这些加工过的代码
@Override
public void visit(MyElement e) {
System.out.println("[元素类型:"+e.getType()+"位数,"+"元素值:"+e.getValue()+"]");
}
}
数据结构
import java.util.ArrayList;
import java.util.List;
//正常情况下,我们会将 操作方法 直接写在 MyStructure数据结构里,但这样就改变了MyStructure,
//为了不用改变MyStructure,我们将操作写在IVisitor的实现类里。
public class MyStructure {
private List<MyElement> list = new ArrayList<MyElement>();
public void add(int a){
if(a<10&&a>=0)
list.add(new MyElement(1,a));//一位数
if(a<100&&a>=10)
list.add(new MyElement(2,a));//两位数
if(a<1000&&a>=100)
list.add(new MyElement(3,a));//三位数
}
public List<MyElement> getList() {
return list;
}
public void setList(List<MyElement> list) {
this.list = list;
}
}
测试
import java.util.Random;
public class test {
public static void main(String[] args){
//先给MyStructure一些用于测试的随机数据
MyStructure struct = new MyStructure();
Random ran = new Random();
for(int i = 0;i<100;i++){
int a=ran.nextInt(1000);
struct.add(a);
}
//测试MyVisitor
for(MyElement e:struct.getList()){
//元素的accept方法:接收MyVisitor,并执行MyVisitor的方法visit
e.accept(new MyVisitor());
}
}
}