spring源码设计模式分析(八)-访问者模式

简介: spring源码设计模式分析(八)-访问者模式

访问者模式

意图:主要将数据结构与数据操作分离。

写一个demo:,这个demo称之为元素,而元素里的每一个属性称之为每一条数据,从而推为数据库中的一张表。类的属性称之为数据结构,set和get方法称之为行为。属性结构非常稳定,行为变化非常快。访问者模式就是将数据结构与行为进行解耦,这两个也能在不同的地方操作。

  1. package com.weizhaoyang.visitor;

  2. import java.util.List;

  3. public class Demo {
  4.    private String name;
  5.    private String name1;
  6.    private List nameList;

  7.    public void access(){

  8.    }
  9.    public String getName() {
  10.        return name;
  11.    }

  12.    public void setName(String name) {
  13.        this.name = name;
  14.    }

  15.    public String getName1() {
  16.        return name1;
  17.    }

  18.    public void setName1(String name1) {
  19.        this.name1 = name1;
  20.    }

  21.    public List getNameList() {
  22.        return nameList;
  23.    }

  24.    public void setNameList(List nameList) {
  25.        this.nameList = nameList;
  26.    }

  27. }

1、属性的操作是由访问者来操作的,访问者根据访问属性的特点做出相应的回答。demo这个人必须接受访问者,访问者才能来访问。提供一个access的方法:

2、在不同的环境里面,上面的demo类中有两个属性如果都要修改的话,然而每一次都会将demo进行修改,会有很多问题,如果有一个访问者的话,结构不变,行为会通过访问方法来动态的进行改变,就解决了很多环境的问题。

代码如下:1、新建一个访问者的接口:

  1. package com.weizhaoyang.visitor;

  2. import java.util.List;

  3. public interface Visitor {
  4.    public void visitiorName( String name);
  5.    public void visitiorAge(String age);
  6.    public void visitiorEmp(List<String> listEmp);
  7.    public void visitiorFamily(List<String>listFamily);

  8. }

2、创建一个被访问者:

  1. package com.weizhaoyang.visitor;

  2. import java.util.List;

  3. /**
  4. * 老板对象
  5. */
  6. public class Boos {
  7.    /////////////////////////整体的结构
  8.    //名称
  9.    private  String name;
  10.    //年龄
  11.    private String age;
  12.    //公司员工名称
  13.    private List<String> listEmp;
  14.    //访问家庭
  15.    private  List<String> listFamily;
  16.    ///////////////////访问者
  17.    private Visitor  visitor;

  18.    public Boos(String name, String age, List<String> listEmp, List<String> listFamily) {
  19.        this.name = name;
  20.        this.age = age;
  21.        this.listEmp = listEmp;
  22.        this.listFamily = listFamily;
  23.    }

  24.    ///////////////////接收访问者的方法
  25.    public  void  accpet(Visitor  visitor){
  26.       this.visitor=visitor;
  27.       //授权
  28.        visitior();
  29.    }
  30.    //给访问者赋予权限
  31.    private  void  visitior(){
  32.        visitor.visitiorAge(age);
  33.        visitor.visitiorEmp(listEmp);
  34.        visitor.visitiorFamily(listFamily);
  35.        visitor.visitiorName(name);
  36.    }

  37. }

具体的访问者的代码如下:

  1. package com.weizhaoyang.visitor;

  2. import java.util.List;

  3. /**
  4. * 具体的某一个访问者
  5. */
  6. public class ImplVisitor implements  Visitor {
  7.    @Override
  8.    public void visitiorName(String name) {
  9.        System.out.println("访问名称"+name);
  10.    }

  11.    @Override
  12.    public void visitiorAge(String age) {
  13.        System.out.println("访问年龄"+age);

  14.    }

  15.    @Override
  16.    public void visitiorEmp(List<String> listEmp) {
  17.        System.out.println("访问员工"+listEmp.size());
  18.    }

  19.    @Override
  20.    public void visitiorFamily(List<String> listFamily) {
  21.        System.out.println("访问家人"+listFamily.size());
  22.    }
  23. }

测试类的代码如下:

  1. package com.weizhaoyang.visitor;

  2. import java.util.ArrayList;

  3. public class VisitorTest {
  4.    public static void main(String[] args) {
  5.        //初始化老板
  6.        Boos boos=new Boos("魏朝阳","24",new ArrayList<String>(20000),new ArrayList<String>(20));
  7.        //创造访问者
  8.        Visitor  visitor=new ImplVisitor();
  9.        //接收访问者
  10.        boos.accpet(visitor);


  11.    }
  12. }

运行的结果如下:

总结:这就是将结构和行为进行解耦,把set方法和get方法进行一个屏蔽,当属性的变化非常平凡,而结构非常稳定,不想修改这个对象的时候,就可以用访问者模式来动态给这些属性进行操作。

相关文章
|
22天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
49 14
|
2月前
|
Java 调度 开发者
spring的@Scheduled()有几种定时模式?
【10月更文挑战第12天】spring的@Scheduled()有几种定时模式?
121 1
|
2月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
628 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
2月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
229 2
|
3月前
|
设计模式 Java Spring
spring源码设计模式分析(五)-策略模式
spring源码设计模式分析(五)-策略模式
|
3月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
168 5
|
3月前
|
消息中间件 设计模式 缓存
spring源码设计模式分析(四)-观察者模式
spring源码设计模式分析(四)-观察者模式
|
3月前
|
XML 存储 Java
Spring-源码深入分析(二)
Spring-源码深入分析(二)
|
3月前
|
XML 设计模式 Java
Spring-源码深入分析(一)
Spring-源码深入分析(一)
|
Java 应用服务中间件 数据库连接
Spring全家桶之Spring篇深度分析(一)
Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。
Spring全家桶之Spring篇深度分析(一)