设计者模式(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



相关文章
|
程序员
编程原则和模式
编程原则和模式
|
6月前
|
设计模式
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
116 0
|
3月前
|
SQL Java
访问者模式问题之动态语言在实现访问者模式时有啥优势
访问者模式问题之动态语言在实现访问者模式时有啥优势
|
3月前
|
双11
访问者模式问题之在软件工程中,根据特性和场景决定是采用面向对象的抽象还是访问者的抽象,如何实现
访问者模式问题之在软件工程中,根据特性和场景决定是采用面向对象的抽象还是访问者的抽象,如何实现
|
3月前
|
设计模式
抽象工厂和原型设计模式之间的区别
【8月更文挑战第22天】
32 0
|
6月前
|
设计模式 存储 SQL
第四篇 行为型设计模式 - 灵活定义对象间交互
第四篇 行为型设计模式 - 灵活定义对象间交互
124 0
|
6月前
|
设计模式 存储
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
|
设计模式 算法
设计者模式之建造者模式
设计者模式之建造者模式
设计者模式之建造者模式
|
设计模式 算法
23种设计模式-关系模式-访问者模式(二十一)
23种设计模式-关系模式-访问者模式(二十一)
23种设计模式-关系模式-访问者模式(二十一)
|
设计模式 编译器
23种设计模式-关系模式-解释器模式(二十三)
23种设计模式-关系模式-解释器模式(二十三)
23种设计模式-关系模式-解释器模式(二十三)