java设计模式-访问者模式

说明

顾名思义使用了这个模式后就可以在不修改已有程序结构的前提下,通过添加额外的访问者来完成对已有代码功能的提升,它属于行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
其主要目的是将数据结构与数据操作分离。

角色

抽象访问者(Visitor)角色:声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。
具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。
抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象作为一个参数。
具体节点(ConcreteNode)角色:实现了抽象节点所规定的接受操作。
结构对象(ObjectStructure)角色:有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。

代码实现

1、抽象访问者

package com.zhouzy.sjms.service;

public interface IVisitor {//访问者接口,访问者访问节点,我这边定义了两个节点,两个访问者,访问者访问这两个节点
	 /** 对应于Node1的访问操作 */
    public void visit(Node1 node);

    /** 对应于Node2的访问操作 */
    public void visit(Node2 node);
	
}

2、具体访问者,我定义了两个,实现抽象访问者接口

package com.zhouzy.sjms.service;

public class Visitor1 implements IVisitor{

	@Override
	public void visit(Node1 node) {
		node.doProcess();	//访问节点1
	}

	@Override
	public void visit(Node2 node) {
		node.doProcess(); //访问节点2
	}

}
package com.zhouzy.sjms.service;

public class Visitor2 implements IVisitor{

	@Override
	public void visit(Node1 node) {
		node.doProcess();	//访问节点1
		
	}

	@Override
	public void visit(Node2 node) {
		node.doProcess();	//访问节点2
	}

}

3、抽象节点,主要就是接受访问者的抽象方法,由具体节点实现

package com.zhouzy.sjms.service;

/**
 * 节点
 * @author Administrator
 *
 */
public interface INode {//访问者访问的节点接口,具体的节点需要实现该节点接口
	 /** 接收 */
    public abstract void accept(IVisitor visitor);
}

4、具体节点,我定义了两个,每个节点都有自己的业务处理方法

package com.zhouzy.sjms.service;

public class Node1 implements INode{

	@Override
	public void accept(IVisitor visitor) {
		
		visitor.visit(this);	//节点接受访问者的浏览
	}
	
	public void doProcess(){
		System.out.println("正在访问Node1"); //节点1具体处理逻辑,该方法就是访问者要访问的具体事项
	}

}
package com.zhouzy.sjms.service;

public class Node2 implements INode{

	@Override
	public void accept(IVisitor visitor) {
		visitor.visit(this);
		
	}
	
	public void doProcess(){
		System.out.println("正在访问Node2"); //节点2具体处理逻辑,该方法就是访问者要访问的具体事项
	}

}

5、结构对象,就是在该对象中执行两个方法 1)添加节点  2)然后遍历这些节点接受访问者

package com.zhouzy.sjms.visit;

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

import com.zhouzy.sjms.service.INode;
import com.zhouzy.sjms.service.IVisitor;

public class ObjectStructure {
	private List<INode> nodes = new ArrayList<INode>();
	/** 执行方法操作  接受访问,然后接受方法的具体实现就是访问者访问节点的具体业务逻辑*/
    public void action(IVisitor visitor) {
        for(INode node : nodes) {
            node.accept(visitor);
        }
    }

    /** 添加一个新元素 */
    public void add(INode node){
        nodes.add(node);
    }
}

6、测试

package com.zhouzy.sjms.visit;

import org.junit.Test;

import com.zhouzy.sjms.service.IVisitor;
import com.zhouzy.sjms.service.Node1;
import com.zhouzy.sjms.service.Node2;
import com.zhouzy.sjms.service.Visitor2;

public class VisitorTest {

	@Test
	public void testVisitor() {
		//创建一个结构对象
        ObjectStructure os = new ObjectStructure();
        //给结构增加一个节点
        os.add(new Node1());
        //给结构增加一个节点
        os.add(new Node2());
        //创建一个访问者
        IVisitor visitor = new Visitor2();
        os.action(visitor);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wwwzhouzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值