简介:在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
意图:将数据结构和数据操作分离。
注意:在访问者模式中,一些代码结构和方法名约定俗成。
/**
*抽象元素类,accept方法表示需要接收的访问者。method是需要执行的操作
*/
public abstract class Data {
public int[] arr=new int[]{1,2,3,4,5,6,7,8,9};
public abstract void accept(Operation operation);
public abstract void method();
}
/**
*最小值的元素类
*/
class MinData extends Data{
@Override
public void accept(Operation operation) {
operation.visit(this);
}
@Override
public void method() {
Arrays.sort(arr);
System.err.println("数组的最小值是:"+arr[0]);
}
}
/**
*最大值的元素类
*/
class MaxData extends Data{
@Override
public void accept(Operation operation) {
operation.visit(this);
}
@Override
public void method() {
Arrays.sort(arr);
System.err.println("数组的最大值是:"+arr[arr.length-1]);
}
}
/**
* 抽象的访问者。这里指对数据的操作方式
* @author admin
*
*/
interface Operation{
void visit(MinData minData);
void visit(MaxData maxData);
}
/**
*定义一个具体的访问者,visit方法根据传入对象的不同而调用不同对象的method方法。
*/
class MyOperation implements Operation{
@Override
public void visit(MinData minData) {
minData.method();
}
@Override
public void visit(MaxData maxData) {
maxData.method();
}
}
主方法:
public class Main {
public static void main(String[] args) {
//获取数组最小值
Data data=new MinData();
//此方法实际调用了MyOperation的visit方法,而visit方法又调用了MinData的method方法。
//(相当于直接调用了MinData的method方法。)
data.accept(new MyOperation());
//获取数组最大值
Data data2=new MaxData();
data2.accept(new MyOperation());
}
}
运行结果:
数组的最小值是:1
数组的最大值是:9
参考文章:23种设计模式(9):访问者模式,访问者模式