设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor)
访问者:表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素类的前提下定义作用于这些元素的新操作。

一、说明:
1、IElement 被访问对象.元素(接口);
2、ElementA 被访问对象.元素.实现类;
3、ElementB 被访问对象.元素.实现类;
4、IVisitor 访问者(接口);
5、Visitor 访问者.实现类;
6、ObjectStructure 被访问者对象.角色(拥有元素)。

二、Java实现,代码如下:
1、IElement

package com.java.designPattern.visitor;

/**
 * 被访问对象.元素
 *
 */
public interface IElement {

    public void accept(IVisitor visitor);

    public void doSomething();

}

2、ElementA

package com.java.designPattern.visitor;

/**
 * 被访问对象.元素.实现类
 *
 */
public class ElementA implements IElement {

    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    @Override
    public void doSomething() {
        System.out.println(this.getClass().getSimpleName() + " do something !");
    }

}

3、ElementB

package com.java.designPattern.visitor;

/**
 * 被访问对象.元素.实现类
 *
 */
public class ElementB implements IElement {

    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    @Override
    public void doSomething() {
        System.out.println(this.getClass().getSimpleName() + " do something !");
    }

}

4、IVisitor

package com.java.designPattern.visitor;

/**
 * 访问者
 *
 */
public interface IVisitor {

    public void visit(IElement element);

}

5、Visitor

package com.java.designPattern.visitor;

/**
 * 访问者.实现类
 *
 */
public class Visitor implements IVisitor {

    @Override
    public void visit(IElement element) {
        System.out.println(this.getClass().getSimpleName() + " operate " + element.getClass().getSimpleName());
        element.doSomething();
    }

}

6、ObjectStructure

package com.java.designPattern.visitor;

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

/**
 * 被访问者对象.角色
 *
 */
public class ObjectStructure {

    private List<IElement> list = new ArrayList<IElement>();

    public void addElement(IElement element) {
        list.add(element);
    }

    public void removeElement(IElement element) {
        list.remove(element);
    }

    public void acceptVisitor(IVisitor visitor) {
        for (IElement element : list) {
            element.accept(visitor);
        }
    }

}

7、Test

package com.java.designPattern.visitor;

/**
 * 测试类
 *
 */
public class Test {

    public static void main(String[] args) {
        ObjectStructure obj = new ObjectStructure();
        obj.addElement(new ElementA());
        obj.addElement(new ElementB());

        obj.acceptVisitor(new Visitor());
    }

}

输出:
Visitor operate ElementA
ElementA do something !
Visitor operate ElementB
ElementB do something !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值