访问者模式

2019-08-04  本文已影响0人  意大利大炮

定义

应用场景

适用于数据结构相对稳定的系统
例:1. apt(注解处理工具)通过访问者模式解析注解(参照Think in Java P632);2.大话设计模式中,男人和女人对待不同状态做出不同相应的例子

优缺点

类图

访问者模式类图.jpg

男人与女人的例子

访问者模式代码:
/**
 * Element(抽象元素):人类
 */
public interface Person {
    /**
     * 接受状态
     * @param action
     */
    String accept(Action action);
}
/**
 * Action(抽象访问者):状态
 */
public interface Action {
    /**
     * 获取男人的反应
     * @param person
     * @return
     */
    String GetManConclusion(Man person);
    /**
     * 获取女人反应
     * @param person
     * @return
     */
    String GetManConclusion(Woman person);
}
/**
 * ConcreteElement(抽象访问者): 男人
 */
public class Man implements Person {
    @Override
    public String accept(Action action) {
        // 第二次分派,调用action(访问者)的方法,把自己(元素本身)作为参数传入
        return action.GetManConclusion(this);
    }
}

女人

/**
 * ConcreteElement(抽象访问者): 女人
 */
public class Woman implements Person {
    @Override
    public String accept(Action action) {
        // 第二次分派,调用action(访问者)的方法,把自己(元素本身)作为参数传入
        return action.GetManConclusion(this);
    }
}
/**
 * ConcreteVisitor(具体访问者): 成功状态的响应
 */
public class Success implements Action {
    @Override
    public String GetManConclusion(Man person) {
        return "男人成功时,背后总有一个伟大的女人";
    }

    @Override
    public String GetManConclusion(Woman person) {
        return "女人成功时,背后大多有一个不成功的男人";
    }
}

失败

/**
 * ConcreteVisitor(具体访问者): 失败状态的响应
 */
public class Failure implements Action {
    @Override
    public String GetManConclusion(Man person) {
        return "男人失败时,闷头喝酒,谁也不用劝";
    }

    @Override
    public String GetManConclusion(Woman person) {
        return "女人失败时,眼泪汪汪,谁也劝不了";
    }
}

恋爱

/**
 * ConcreteVisitor(具体访问者): 恋爱状态的响应
 */
public class Love implements Action{
    @Override
    public String GetManConclusion(Man person) {
        return "男人恋爱是,凡事不懂也要装懂";
    }

    @Override
    public String GetManConclusion(Woman person) {
        return "女人恋爱时,遇事懂也装作不懂";
    }
}
/**
 * 用来枚举元素,包含多个元素
 */
public class ObjectStructure {
    private List<Person> elements = new ArrayList<>();

    public void add(Person person) {
        if (null != person) {
            this.elements.add(person);
        }
    }

    public void del(Person person) {
        if (null != person) {
            this.elements.remove(person);
        }
    }

    /**
     * 获取并展示元素对指定状态的响应
     * @param action 指定状态
     */
    public void accept(Action action) {
        if (null == this.elements || 0 >= this.elements.size()) {
            return;
        }
        this.elements.forEach(element -> {
            // 第一次分派,调用元素的接受状态方法,将action(访问者)作为参入
            String result = element.accept(action);
            System.out.println("person: " + element.getClass().getName() + "action: " + action.getClass().getName() +
                    "conclusion: " + result);
        });
    }
}
上一篇 下一篇

猜你喜欢

热点阅读