java设计模式之访问者模式

资料:

(1)设计模式读书笔记-----访问者模式:

https://blog.csdn.net/chenssy/article/details/12029633

访问者模式的特点:

访问者模式数据结构(例如List)作用于结构上的操作(例如remove())解耦合,使得操作集合可相对自由地演化。

我的心得:

如果元素类和访问者类约定好方法

MyElement.accept1(IVisitor v)对应IVisitor.visit1(MyElement e),则visit1对应功能1

MyElement.accept2(IVisitor v)对应IVisitor.visit2(MyElement e),则visit2对应功能2

...以此类推,这样,元素类就通过IVisitor拥有了许多功能。

元素类:


public class MyElement {
	private Object value;

	private Integer type;
	
	public MyElement(Integer type,Object value){
		this.type = type;
		this.value = value;
	}
	
	//正常情况下,为了给元素添加方法,我们会直接将方法写死在元素类里,这样不通用,代码也不优美。
	//解决方法:写一个方法accept,参数注入一个实现了接口IVisitor的实现类对象,
	//所有对元素的操作都写在IVisitor的实现类里,这样就不会写死了。
	public void accept(IVisitor visitor){
		//让元素 亲自 执行 这些被visitor加工过的代码visit
		visitor.visit(this);
	}
	
	
	
	//set...get
}

访问者接口类

public interface IVisitor {
	public void visit(MyElement e);
}

访问者类


public class MyVisitor implements IVisitor{

	//对元素的方法进行加工,然后再将该被加工的方法,给元素的方法(accept)接收,让元素通过调用accept方法,来亲自来执行这些加工过的代码
	@Override
	public void visit(MyElement e) {
		System.out.println("[元素类型:"+e.getType()+"位数,"+"元素值:"+e.getValue()+"]");
	}
	
}

数据结构

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

//正常情况下,我们会将 操作方法 直接写在 MyStructure数据结构里,但这样就改变了MyStructure,
//为了不用改变MyStructure,我们将操作写在IVisitor的实现类里。
public class MyStructure {
	private List<MyElement> list = new ArrayList<MyElement>();
	
	public void add(int a){
		if(a<10&&a>=0) 
			list.add(new MyElement(1,a));//一位数
		if(a<100&&a>=10)
			list.add(new MyElement(2,a));//两位数
		if(a<1000&&a>=100)
			list.add(new MyElement(3,a));//三位数
	}

	public List<MyElement> getList() {
		return list;
	}

	public void setList(List<MyElement> list) {
		this.list = list;
	}
}

测试

import java.util.Random;


public class test {
	public static void main(String[] args){
		//先给MyStructure一些用于测试的随机数据
		MyStructure struct = new MyStructure();
		Random ran = new Random();
		for(int i = 0;i<100;i++){
			int a=ran.nextInt(1000);
			struct.add(a);
		}
		//测试MyVisitor
		for(MyElement e:struct.getList()){
			//元素的accept方法:接收MyVisitor,并执行MyVisitor的方法visit
			e.accept(new MyVisitor());
		}
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值