简介
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
UML图
应用场景
- 适用于数据结构相对稳定且算法易于变化的系统,该模式将数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化
- 增加新的操作较容易
示例
- Visitor:
public abstract class Action {/*** 男人的结论** @param man*/public abstract void manConclusion(Man man);/*** 女人的结论** @param woman*/public abstract void womanConclusion(Woman woman);
}
public class Success extends Action {@Overridepublic void manConclusion(Man man) {System.out.println("背后有个强大的女人!");}@Overridepublic void womanConclusion(Woman woman) {System.out.println("个人素质优秀!");}
}
- Element:
public abstract class People {/*** 男女态度** @param visitor*/public abstract void accept(Action visitor);
}
public class Man extends People {@Overridepublic void accept(Action visitor) {visitor.manConclusion(this);}
}
public class Woman extends People {@Overridepublic void accept(Action visitor) {visitor.womanConclusion(this);}
}
- ObjectStructure:
public class ObjectStructure {private final List<People> peopleList = new ArrayList<>();/*** 添加** @param people*/public void add(People people) {peopleList.add(people);}/*** 删除** @param people*/public void remove(People people) {peopleList.remove(people);}/*** 结果展示*/public void display(Action visitor) {for (People p :peopleList) {p.accept(visitor);}}
}
- 运行
public class Main {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();objectStructure.add(new Woman());objectStructure.add(new Man());Success success = new Success();objectStructure.display(success);}
}
总结
-
优点
- 满足开闭原则,新增操作只需新增访问类即可
-
缺点
- 增加新的数据结构会变得困难