16.访问者模式
一.什么是访问者模式
封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下,定义作用于这些元素的新操作。
二、角色
- (1) Vistor(抽象访问者):为该对象结构中具体元素角色声明一个访问操作接口。
- (2) ConcreteVisitor(具体访问者):每个具体访问者都实现了Vistor中定义的操作。
- (3) Element(抽象元素):定义了一个accept操作,以Visitor作为参数。
- (4) ConcreteElement(具体元素):实现了Element中的accept()方法,调用Vistor的访问方法以便完成对一个元素的操作。
- (5) ObjectStructure(对象结构):可以是组合模式,也可以是集合;能够枚举它包含的元素;提供一个接口,允许Vistor访问它的元素。
三、代码
1、抽象访问者
java
public interface Tasker {
void visitZhuang(ZhuangHero zhuangHero);
void visitZhen(ZhenHero zhenHero);
}
2、具体访问者1
java
public class MyTasker implements Tasker {
@Override
public void visitZhuang(ZhuangHero zhuangHero) {
System.out.println("我访问了庄周,庄周释放技能");
zhuangHero.operate();
}
@Override
public void visitZhen(ZhenHero zhenHero) {
System.out.println("我访问了甄姬,甄姬释放技能");
zhenHero.operate();
}
}
具体访问者2
public class OtherTasker implements Tasker {
@Override
public void visitZhuang(ZhuangHero zhuangHero) {
System.out.println("其他人访问庄周,庄周开始使出技能");
zhuangHero.operate();
}
@Override
public void visitZhen(ZhenHero zhenHero) {
System.out.println("其他人访问甄姬,庄周开始使出技能");
zhenHero.operate();
}
}
3、抽象元素
java
public abstract class Hero {
public abstract void accept(Tasker tasker);
}
4、具体元素(1)
java
@Data
@NoArgsConstructor
public class ZhenHero extends Hero {
@Override
public void accept(Tasker tasker) {
tasker.visitZhen(this);
}
public void operate(){
System.out.println("甄姬释放出技能");
}
}
具体元素(2)
java
@NoArgsConstructor
@Data
public class ZhuangHero extends Hero {
@Override
public void accept(Tasker tasker) {
tasker.visitZhuang(this);
}
public void operate(){
System.out.println("庄周释放出技能");
}
}
5.对象结构
java
public class ObjectStructure {
private List<Hero> heroList = new ArrayList<>();
public void handleRequest(Tasker tasker){
for (Hero hero : heroList) {
hero.accept(tasker);
}
}
public void addHero(Hero hero){
heroList.add(hero);
}
}
6.测试类
java
public class VisitorTest {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
Hero zhuangHero = new ZhuangHero();
Hero zhenHero = new ZhenHero();
objectStructure.addHero(zhuangHero);
objectStructure.addHero(zhenHero);
Tasker myTasker = new MyTasker();
Tasker otherTasker = new OtherTasker();
objectStructure.handleRequest(myTasker);
objectStructure.handleRequest(otherTasker);
}
}