《大话设计模式》访问者模式 Java代码

最后一个设计模式了
不想学习…

定义

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

目的:把处理数据从数据结构分离出来
应用:系统有比较稳定的数据结构,又有易于变化的算法。
优点:增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。
缺点:使增加新的数据结构变得困难了。

结构图

代码

//客户端代码
public class Main {
    public static void main(String[] args) {
        ObjectStructure o=new ObjectStructure();
        o.Attach(new ConcreteElementA());
        o.Attach(new ConcreteElementB());
        ConcreteVisitor1 v1=new ConcreteVisitor1();
        ConcreteVisitor2 v2=new ConcreteVisitor2();
        o.Accept(v1);
        o.Accept(v2);
    }
}
//Visitor类,为该对象结构中ConcreteElement的每一个类声明一个Visit操作
abstract class Visitor{
    public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
    public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
//ConcreteVisitor1和ConcreteVisitor2类,具体访问者,
//实现每个由Visitor声明的操作。
//每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类
class ConcreteVisitor1 extends Visitor{
    @Override
    public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getName()+"被"+this.getClass().getName()+"访问");
    }

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

class ConcreteVisitor2 extends Visitor{
    @Override
    public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getName()+"被"+this.getClass().getName()+"访问");
    }

    @Override
    public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getName()+"被"+this.getClass().getName()+"访问");
    }
}
//Element类,定义一个Accpet操作,它以一个访问者为操作
abstract class Element{
    public abstract void Accept(Visitor visitor);
}
//ConcreteElementA和ConcreteElementB,具体元素,实现Accept操作
class ConcreteElementA extends Element{
    @Override
    public void Accept(Visitor visitor) {
        visitor.VisitConcreteElementA(this);
    }
    public void OperationA(){}//其他的相关方法
}
//ConcreteElementA和ConcreteElementB,具体元素,实现Accept操作
class ConcreteElementB extends Element{
    @Override
    public void Accept(Visitor visitor) {
        visitor.VisitConcreteElementB(this);
    }
    public void OperationB(){}//其他的相关方法
}
//ObjectStructure类,能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
class ObjectStructure{
    private ArrayList<Element> elements=new ArrayList<>();
    public void Attach(Element element){
        elements.add(element);
    }
    public void Detach(Element element){
        elements.remove(element);
    }
    public void Accept(Visitor visitor){
        for(Element e:elements){
            e.Accept(visitor);
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值