将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如成功、失败等)
对原理类图的说明-即(访问者模式的角色及职责)
将人分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如成功、失败等),请使用访问者模式来说实现
package com.flower.fangwenzhe;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.IntStream;
public class TestMain {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
IntStream.range(0,3).forEach(i -> o.attach(new Man()));
IntStream.range(0,3).forEach(i -> o.attach(new WoMan()));
Success success = new Success();
o.display(success);
Fail fail = new Fail();
o.display(fail);
}
}
abstract class Action{
public abstract void getManResult(Man man);
public abstract void getWoManResult(WoMan woman);
}
class Success extends Action{
@Override
public void getManResult(Man man) {
System.out.println("man is success");
}
@Override
public void getWoManResult(WoMan woman) {
System.out.println("woman is fail");
}
}
class Fail extends Action{
@Override
public void getManResult(Man man) {
System.out.println("man is fail");
}
@Override
public void getWoManResult(WoMan woman) {
System.out.println("woman is success");
}
}
abstract class Person{
public abstract void accept(Action action);
}
class Man extends Person{
@Override
public void accept(Action action) {
action.getManResult(this);
}
}
class WoMan extends Person{
@Override
public void accept(Action action) {
action.getWoManResult(this);
}
}
class ObjectStructure{
private List<Person> personList = new LinkedList<>();
public void attach(Person person){
personList.add(person);
}
public void detach(Person person){
personList.remove(person);
}
public void display(Action action){
personList.forEach(x -> x.accept(action));
}
}
上面提到了双分派,所谓双分派是指不管类怎么变化,我们都能找到期望的方法运行。双分派意味着得到执行的操作取决于请求的种类和两个接收者的类型
以上述实例为例,假设我们要添加一个Wait的状态类,考察Man类和Woman类的反应,由于使用了双分派,只需增加一个Action子类即可在客户端调用即可,不需要改动任何其他类的代码。