《大话设计模式》Java代码示例(二十四)之访问者模式

本文深入解析了访问者模式,一种允许在不修改元素类的情况下,为对象结构中的元素添加新操作的设计模式。通过实例展示了如何在不同的状态中,男人和女人会有不同的反应,包括成功、失败、恋爱和结婚等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

package visitor;

/**
 * 访问者模式(Visitor)
 * "状态"的抽象类
 */
public abstract class Action {

    // 得到男人结论或反应
    public abstract void getManConclusion(Man concreteElementA);
    // 得到女人结论或反应
    public abstract void getWomanConclusion(Woman concreteElementB);

}
package visitor;

/**
 * 访问者模式(Visitor)
 * "人"的抽象类
 */
public abstract class Person {

    // 接受
    public abstract void accept(Action visitor);

}
package visitor;

/**
 * 访问者模式(Visitor)
 * "男人"类
 */
public class Man extends Person {

    @Override
    public void accept(Action visitor) {
        visitor.getManConclusion(this);
    }

}
package visitor;

/**
 * 访问者模式(Visitor)
 * "女人"类
 */
public class Woman extends Person {

    @Override
    public void accept(Action visitor) {
        visitor.getWomanConclusion(this);
    }

}
package visitor;

/**
 * 访问者模式(Visitor)
 * 具体"状态"类:成功
 */
public class Success extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,背后多半有一个伟大的女人。");
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,背后大多有一个不成功的男人。");
    }

}
package visitor;

/**
 * 访问者模式(Visitor)
 * 具体"状态"类:失败
 */
public class Failing extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,闷头喝酒,谁也不用劝。");
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,眼泪汪汪,谁也劝不了。");
    }

}
package visitor;

/**
 * 访问者模式(Visitor)
 * 具体"状态"类:恋爱
 */
public class Amativeness extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,凡事不懂也要装懂。");
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,遇事懂也装作不懂。");
    }

}
package visitor;

/**
 * 访问者模式(Visitor)
 * 具体"状态"类:结婚
 */
public class Marriage extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,感慨道:恋爱游戏终结时,'有妻徒刑'遥无期。");
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
                + "时,欣慰曰:爱情长跑路漫漫,婚姻保险保平安。");
    }

}
package visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * 访问者模式(Visitor)
 * 对象结构
 */
public class ObjectStructure {

    private List<Person> elements = new ArrayList<>();

    // 增加
    public void attach(Person element) {
        elements.add(element);
    }

    // 移除
    public void detach(Person element) {
        elements.remove(element);
    }

    // 查看显示
    public void display(Action visitor) {
        for (Person e : elements) {
            e.accept(visitor);
        }
    }

}
package visitor;

/**
 * 访问者模式(Visitor)
 * 客户端main方法
 */
public class Client {

    public static void main(String[] args) {
        ObjectStructure o = new ObjectStructure();
        o.attach(new Man());
        o.attach(new Woman());
        // 成功时的反应
        Success v1 = new Success();
        o.display(v1);
        // 失败时的反应
        Failing v2 = new Failing();
        o.display(v2);
        // 恋爱时的反应
        Amativeness v3 = new Amativeness();
        o.display(v3);
        // 结婚时的反应
        Marriage v4 = new Marriage();
        o.display(v4);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值