淘宝联盟做返利网站,网站外链建设设计,抚州市临川区建设局网站,桂林象鼻山的传说访问者模式 在访问者模式#xff08;Visitor Pattern#xff09;中#xff0c;我们使用了一个访问者类#xff0c;它改变了元素类的执行算法。通过这种方式#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式#xff0c;元… 访问者模式 在访问者模式Visitor Pattern中我们使用了一个访问者类它改变了元素类的执行算法。通过这种方式元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式元素对象已接受访问者对象这样访问者对象就可以处理元素对象上的操作。
介绍
意图 主要将数据结构与数据操作分离。
主要解决 稳定的数据结构和易变的操作耦合问题。
何时使用 需要对一个对象结构中的对象进行很多不同的并且不相关的操作而需要避免让这些操作污染这些对象的类使用访问者模式将这些封装到类中。
如何解决 在被访问的类里面加一个对外提供接待访问者的接口。
关键代码 在数据基础类里面有一个方法接受访问者将自身引用传入访问者。
应用实例 您在朋友家做客您是访问者朋友接受您的访问您通过朋友的描述然后对朋友的描述做出一个判断这就是访问者模式。
优点
符合单一职责原则。优秀的扩展性。灵活性。
缺点
具体元素对访问者公布细节违反了迪米特原则。具体元素变更比较困难。违反了依赖倒置原则依赖了具体类没有依赖抽象。
使用场景
对象结构中对象对应的类很少改变但经常需要在此对象结构上定义新的操作。需要对一个对象结构中的对象进行很多不同的并且不相关的操作而需要避免让这些操作污染这些对象的类也不希望在增加新操作时修改这些类。
注意事项 访问者可以对功能进行统一可以做报表、UI、拦截器与过滤器。 代码实现 定义抽象元素
/*** 元素接口*/
public interface Element {void accept(Visitor visitor);
}定义具体元素
public class ArrayElement implements Element{private final int arr[];public ArrayElement(int arr[]){this.arr arr;}public int[] getArr() {return arr;}Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}定义抽象访问者
/*** 访问者接口*/
public interface Visitor {void visit(ArrayElement element);}分别实现最大值访问和最小值访问而不更改原始的ArrayElement类的任何方法和数据
public class MaxVisitor implements Visitor{public void visit(ArrayElement element) {int[] arr element.getArr();int max Integer.MIN_VALUE;for (int j : arr) {if (j max) {max j;}}System.out.println(数组最大值为 max);}
}public class MinVisitor implements Visitor{Overridepublic void visit(ArrayElement element) {int[] arr element.getArr();int min Integer.MAX_VALUE;for (int j : arr) {if (j min) {min j;}}System.out.println(数组最小值 min);}
}客户端
public class Client {public static void main(String[] args) {ArrayElement arrayElement new ArrayElement(new int[]{4,7,3,1,8,9,2,5,6});arrayElement.accept(new MaxVisitor());arrayElement.accept(new MinVisitor());}
}