23种设计模式之访问者模式(19)

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

  • 访问者模式适用于数据结构相对稳定的系统。(如人类只有两个性别,可进行各状态对比)。

  • 他把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

  • 访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。

  • 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为及中到一个访问这对象中。

  • 访问者模式缺点,使增加新的数据结构变得困难了。
    在这里插入图片描述

  • Visitor.java

    public abstract class Visitor {
        public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
    
        public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
    }
    
  • ConcreteVisitor1.java 访问者1

    public 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() + "访问");
        }
    }
    
  • ConcreteVisitor2.java

    public 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.java

    public abstract class Element {
        public abstract void accept(Visitor visitor);
    }
    
  • ConcreteElementA.java

    /**
     * 实例元素1(男)
     */
    public class ConcreteElementA extends Element {
        @Override public void accept(Visitor visitor) {
            visitor.VisitConcreteElementA(this);
        }
    
        public void OperationA() {
            System.out.println("AAAAAAAAAAA");
        }
    }
    
  • ConcreteElementB.java

    /**
     * 实例元素2(女)
     */
    public class ConcreteElementB extends Element {
        @Override public void accept(Visitor visitor) {
            visitor.VisitConcreteElementB(this);
        }
    
        public void OperationB() {
            System.out.println("BBBBBBBBBBB");
        }
    }
    
  • ObjectStructure.java 能枚举他的元素,可以提供一个高层的接口以允许访问者访问他的元素

    public class ObjectStructure {
        private List<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);
            }
        }
    }
    
  • Main.java

    public class Main {
        public static void main(String[] args) {
            final ObjectStructure o = new ObjectStructure();
            o.attach(new ConcreteElementA());
            o.attach(new ConcreteElementB());
    
            final ConcreteVisitor1 v1 = new ConcreteVisitor1();
            final ConcreteVisitor2 v2 = new ConcreteVisitor2();
    
            o.accept(v1);
            o.accept(v2);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值