java 访问者模式(大话设计模式)

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

访问者模式适用于数据结构相对稳定的系统。如果一个系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式比较合适。【互相组合】
在这里插入图片描述

/**
 * 为该对象结构中ConcreteElement的每一个类声明一个Visit操作
 * 
 * @author administrator
 *
 */
public abstract class Visitor {

    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);

    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);

}

class ConcreteVisitor1 extends Visitor {

    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
	System.out.println(concreteElementA.getClass().getSimpleName() + "被"
		+ this.getClass().getSimpleName() + "访问");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
	System.out.println(concreteElementB.getClass().getSimpleName() + "被"
		+ this.getClass().getSimpleName() + "访问");
    }

}

class ConcreteVisitor2 extends Visitor {

    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
	System.out.println(concreteElementA.getClass().getSimpleName() + "被"
		+ this.getClass().getSimpleName() + "访问");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
	System.out.println(concreteElementB.getClass().getSimpleName() + "被"
		+ this.getClass().getSimpleName() + "访问");
    }

}
/**
 * 定义一个accept操作,它以一个访问者为参数
 * 
 * @author administrator
 *
 */
public abstract class Element {
    public abstract void accept(Visitor visitor);
}

class ConcreteElementA extends Element {

    @Override
    public void accept(Visitor visitor) {
	visitor.visitConcreteElementA(this);
    }

}

class ConcreteElementB extends Element {

    @Override
    public void accept(Visitor visitor) {
	visitor.visitConcreteElementB(this);
    }

}
/**
 * 提供一个高层的接口以允许访问者访问它的元素
 * 
 * @author administrator
 *
 */
public class ObjectStructure {

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

    public void attach(Element element) {
	elements.add(element);
    }

    public void detach(Element element) {
	elements.remove(element);
    }

    public void accept(Visitor visitor) {
	for (Element element : elements) {
	    element.accept(visitor);
	}
    }
}
/**
 * 客户端
 * 
 * @author administrator
 *
 */
public class VisitorClient {

    public static void main(String[] args) {
	ObjectStructure o = new ObjectStructure();

	o.attach(new ConcreteElementA());
	o.attach(new ConcreteElementB());

	ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
	ConcreteVisitor2 visitor2 = new ConcreteVisitor2();

	o.accept(visitor1);
	o.accept(visitor2);
    }
}

案例

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

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

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

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

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

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

}

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

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

}
/**
 * 访问者模式(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()
                + "时,遇事懂也装作不懂。");
    }

}
/**
 * 访问者模式(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()
                + "时,眼泪汪汪,谁也劝不了。");
    }

}
/**
 * 访问者模式(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()
                + "时,欣慰曰:爱情长跑路漫漫,婚姻保险保平安。");
    }

}
/**
 * 访问者模式(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()
                + "时,背后大多有一个不成功的男人。");
    }

}
/**
 * 访问者模式(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);
        }
    }

}
/**
 * 访问者模式(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、付费专栏及课程。

余额充值