java设计模式(行为型)之访问者模式

第0章:简介

访问者模式的定义:用表示“访问者”的类来访问数据结构中的元素,并把各元素的处理交给访问者类。这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可。

访问者模式的本质:分离数据结构和处理

参考:研磨设计模式(书籍),大话设计模式(书籍),图解设计模式(书籍)

模式图:

待补充

第1章:实践

第0节:模板方法模式(原语、钩子操作实现)

(1)访问者接口(Visitor.java)

package com.mcc.core.designPattern.behavior.visitor;

/**
 * 访问者接口
 *
 * 访问者模式的定义:用表示“访问者”的类来访问数据结构中的元素,并把各元素的处理交给访问者类。
 *      这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可。
 * 访问者模式的本质:分离数据结构和处理
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public interface Visitor {

    /**
     * 访问节点A
     * @param concreteNodeA
     */
    public void visit(ConcreteNodeA concreteNodeA);

    /**
     * 访问节点B
     * @param concreteNodeB
     */
    public void visit(ConcreteNodeB concreteNodeB);
}
(2)访问者1(ConcreteVisitor1.java)

package com.mcc.core.designPattern.behavior.visitor;

/**
 * 访问者1
 *
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public class ConcreteVisitor1 implements Visitor {

    /**
     * 访问者1访问节点A
     * @param concreteNodeA
     */
    @Override
    public void visit(ConcreteNodeA concreteNodeA) {
        System.out.println("访问者1访问节点A的方法:");
        //访问者1访问节点A的方法
        concreteNodeA.method();
    }

    /**
     * 访问者1访问节点B
     * @param concreteNodeB
     */
    @Override
    public void visit(ConcreteNodeB concreteNodeB) {
        System.out.println("访问者1访问节点B的方法:");
        //访问者1访问节点B的方法
        concreteNodeB.method();
    }
}

(3)访问者2(ConcreteVisitor2.java

package com.mcc.core.designPattern.behavior.visitor;

/**
 * 访问者2
 *
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public class ConcreteVisitor2 implements Visitor {

    /**
     * 访问者2访问节点A
     * @param concreteNodeA
     */
    @Override
    public void visit(ConcreteNodeA concreteNodeA) {
        System.out.println("访问者2访问节点A的方法:");
        //访问者1访问节点A的方法
        concreteNodeA.method();
    }

    /**
     * 访问者2访问节点B
     * @param concreteNodeB
     */
    @Override
    public void visit(ConcreteNodeB concreteNodeB) {
        System.out.println("访问者2访问节点B的方法:");
        //访问者1访问节点B的方法
        concreteNodeB.method();
    }
}

(4)抽象节点接口(Node.java

package com.mcc.core.designPattern.behavior.visitor;

/**
 * 抽象节点接口(数据节点),接受一个访问者对象
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public abstract class Node {

    /**
     * 接受访问者的操作
     * @param visitor
     */
    public abstract void accept(Visitor visitor);
}
(5)具体节点A(ConcreteNodeA.java
package com.mcc.core.designPattern.behavior.visitor;

/**
 * 具体节点A
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public class ConcreteNodeA extends Node{

    /**
     * 接受访问者的操作
     * @param visitor
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    /**
     * 节点A的方法
     */
    public void method(){
        System.out.println("节点A自有的方法");
    }
}
(6)具体节点B (ConcreteNodeB.java
package com.mcc.core.designPattern.behavior.visitor;

/**
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public class ConcreteNodeB extends Node {

    /**
     * 接受访问者的操作
     * @param visitor
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    /**
     * 节点B的方法
     */
    public void method(){
        System.out.println("节点B自有的方法");
    }
}
(7)结构对象 ObjectStructure .java
package com.mcc.core.designPattern.behavior.visitor;

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

/**
 * 结构对象
 * 可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;
 * 如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public class ObjectStructure {

    private List<Node> nodes = new ArrayList<Node>();

    /**
     * 执行方法操作,接受访问者的操作
     * @param visitor
     */
    public void action(Visitor visitor){
        for(Node node : nodes)
        {
            node.accept(visitor);
        }
    }

    /**
     * 添加新节点
     * @param node
     */
    public void add(Node node){
        nodes.add(node);
    }

}
(8)客户端测试(Client.java)
package com.mcc.core.designPattern.behavior.visitor;

/**
 * 客户端测试
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         My blog: https://blog.csdn.net/menergy
 *         Created by Administrator on 2018/4/29.
 */
public class Client {

    public static void main(String[] args){

        //创建一个结构对象
        ObjectStructure os = new ObjectStructure();
        //给结构增加一个节点A
        os.add(new ConcreteNodeA());
        //给结构增加一个节点B
        os.add(new ConcreteNodeB());
        //创建访问者1
        Visitor visitor1 = new ConcreteVisitor1();
        os.action(visitor1);

        System.out.println("---------------------------------------");
        //给结构再增加一个节点
        os.add(new ConcreteNodeA());
        //创建访问者1
        Visitor visitor2 = new ConcreteVisitor1();
        os.action(visitor2);

    }
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值