设计者模式(22) -- 访问者模式

简介: 设计者模式(22) -- 访问者模式

需求


1dc618a0ed9580ce8bfa6facb208c08f.png


传统方式的问题分析


5d4c6812c8535adbb050f4ddf2e1bce8.png


访问者模式


基本介绍


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


访问者模式的原理类图


66ba272a0bfc97be54a5fa679e3d5482.png


使用访问者模式实现歌手测评需求


类图:


1dc618a0ed9580ce8bfa6facb208c08f.png


代码:


Person
public abstract class Person {
  //提供一个方法,让访问者可以访问
  public abstract void accept(Action action);
}


Woman


//说明
//1. 这里我们使用到了双分派, 即首先在客户端程序中,将具体状态作为参数传递Woman中(第一次分派)
//2. 然后Woman 类调用作为参数的 "具体方法" 中方法getWomanResult, 同时将自己(this)作为参数
//   传入,完成第二次的分派
public class Woman extends Person{
  @Override
  public void accept(Action action) {
  // TODO Auto-generated method stub
  action.getWomanResult(this);
  }
}


Man


public class Man extends Person {
  @Override
  public void accept(Action action) {
  // TODO Auto-generated method stub
  action.getManResult(this);
  }
}


Action


public abstract class Action {
  //得到男性 的测评
  public abstract void getManResult(Man man);
  //得到女的 测评
  public abstract void getWomanResult(Woman woman);
}


Success


public class Success extends Action {
  @Override
  public void getManResult(Man man) {
  // TODO Auto-generated method stub
  System.out.println(" 男人给的评价该歌手很成功 !");
  }
  @Override
  public void getWomanResult(Woman woman) {
  // TODO Auto-generated method stub
  System.out.println(" 女人给的评价该歌手很成功 !");
  }
}


Fail


public class Fail extends Action {
  @Override
  public void getManResult(Man man) {
  // TODO Auto-generated method stub
  System.out.println(" 男人给的评价该歌手失败 !");
  }
  @Override
  public void getWomanResult(Woman woman) {
  // TODO Auto-generated method stub
  System.out.println(" 女人给的评价该歌手失败 !");
  }
}


Wait


public class Wait extends Action {
  @Override
  public void getManResult(Man man) {
  // TODO Auto-generated method stub
  System.out.println(" 男人给的评价是该歌手待定 ..");
  }
  @Override
  public void getWomanResult(Woman woman) {
  // TODO Auto-generated method stub
  System.out.println(" 女人给的评价是该歌手待定 ..");
  }
}


ObjectStructure


//数据结构,管理很多人(Man , Woman)
public class ObjectStructure {
  //维护了一个集合
  private List<Person> persons = new LinkedList<>();
  //增加到list
  public void attach(Person p) {
  persons.add(p);
  }
  //移除
  public void detach(Person p) {
  persons.remove(p);
  }
  //显示测评情况
  public void display(Action action) {
  for(Person p: persons) {
    p.accept(action);
  }
  }
}


Client


public class Client {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  //创建ObjectStructure
  ObjectStructure objectStructure = new ObjectStructure();
  objectStructure.attach(new Man());
  objectStructure.attach(new Woman());
  //成功
  Success success = new Success();
  objectStructure.display(success);
  System.out.println("===============");
  Fail fail = new Fail();
  objectStructure.display(fail);
  System.out.println("=======给的是待定的测评========");
  Wait wait = new Wait();
  objectStructure.display(wait);
  }
}


运行结果:

5d4c6812c8535adbb050f4ddf2e1bce8.png


总结


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


访问者模式的注意事项和细节


66ba272a0bfc97be54a5fa679e3d5482.png



相关文章
|
9月前
|
安全 Java API
【JUC进阶】01. Synchroized实现原理
Synchronized是在并发编程中很经常使用,Java中除了提供Lock等API来实现互斥以外,还提供了语法(关键字)层面的Synchronized来实现互斥同步原语,今天闲来聊聊Synchronized关键字。
118 12
|
分布式计算 安全 Java
Spark 编译出现 InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Spark 编译出现 InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
438 0
|
JavaScript Java 关系型数据库
民宿预定管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
民宿预定管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
550 0
民宿预定管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
|
SQL 监控 关系型数据库
高性能 MySQL 第四版(GPT 重译)(三)(3)
高性能 MySQL 第四版(GPT 重译)(三)
188 4
|
存储 JavaScript 前端开发
针对 jar 和 vue 的一键自动化部署工具,界面友好,操作简单(已开源)2
针对 jar 和 vue 的一键自动化部署工具,界面友好,操作简单(已开源)2
|
存储 SQL 数据库
Flask Web 极简教程(三)- SqlAlchemy(Part A)
Flask Web 极简教程(三)- SqlAlchemy(Part A)
Flask Web 极简教程(三)- SqlAlchemy(Part A)
|
安全 网络协议 测试技术
『软件测试6』bug一两是小事,但安全漏洞是大事!(二)
前面我们讲过黑白盒测试和性能测试,但是呢,对于一个软件来说,安全测试也是非常重要的。就像封面所示,内容很诱人,一旦用户点击进去,就很容易让其执行非本意的操作,试想下结果……不堪设想。因此,做好软件安全测试,共同营造一个良好的软件环境是至关重要的。 在下面的这篇文章中,将讲解关于软件测试中的安全测试。一起来学习吧~
『软件测试6』bug一两是小事,但安全漏洞是大事!(二)
|
Java 编译器
《JAVA核心技术》学习笔记--动态绑定
在java中类继承之后,一个对象变量在运行过程中可以自动寻找合适的方法执行,这就称为动态绑定。本文将用书中的例子记录动态绑定的执行过程。本文代码来自《JAVA核心技术》第五章,具体内容请参考原书。
238 0
|
消息中间件 监控 Kafka