網(wǎng)站域名空間費發(fā)票廣告詞
16.訪問者模式
一.什么是訪問者模式
封裝一些作用于某種數(shù)據(jù)結構中的各元素的操作,它可以在不改變這個數(shù)據(jù)結構的前提下,定義作用于這些元素的新操作。
二、角色
- (1) Vistor(抽象訪問者):為該對象結構中具體元素角色聲明一個訪問操作接口。
- (2) ConcreteVisitor(具體訪問者):每個具體訪問者都實現(xiàn)了Vistor中定義的操作。
- (3) Element(抽象元素):定義了一個accept操作,以Visitor作為參數(shù)。
- (4) ConcreteElement(具體元素):實現(xiàn)了Element中的accept()方法,調用Vistor的訪問方法以便完成對一個元素的操作。
- (5) ObjectStructure(對象結構):可以是組合模式,也可以是集合;能夠枚舉它包含的元素;提供一個接口,允許Vistor訪問它的元素。
三、代碼
1、抽象訪問者
public interface Tasker {void visitZhuang(ZhuangHero zhuangHero);void visitZhen(ZhenHero zhenHero);
}
2、具體訪問者1
public class MyTasker implements Tasker {@Overridepublic void visitZhuang(ZhuangHero zhuangHero) {System.out.println("我訪問了莊周,莊周釋放技能");zhuangHero.operate();}@Overridepublic void visitZhen(ZhenHero zhenHero) {System.out.println("我訪問了甄姬,甄姬釋放技能");zhenHero.operate();}
}具體訪問者2
public class OtherTasker implements Tasker {@Overridepublic void visitZhuang(ZhuangHero zhuangHero) {System.out.println("其他人訪問莊周,莊周開始使出技能");zhuangHero.operate();}@Overridepublic void visitZhen(ZhenHero zhenHero) {System.out.println("其他人訪問甄姬,莊周開始使出技能");zhenHero.operate();}
}
3、抽象元素
public abstract class Hero {public abstract void accept(Tasker tasker);
}
4、具體元素(1)
@Data
@NoArgsConstructor
public class ZhenHero extends Hero {@Overridepublic void accept(Tasker tasker) {tasker.visitZhen(this);}public void operate(){System.out.println("甄姬釋放出技能");}
}
具體元素(2)
@NoArgsConstructor
@Data
public class ZhuangHero extends Hero {@Overridepublic void accept(Tasker tasker) {tasker.visitZhuang(this);}public void operate(){System.out.println("莊周釋放出技能");}
}
5.對象結構
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.測試類
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);}
}