java设计模式之访问者模式

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:16   2798   0

资料:

(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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP