访问者设计模式
一、访问者设计模式
1、介绍
访问者模式:封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用与这些元素的新的操作。
主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题
访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口
访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免这些操作“污染”这些对象的类,可以选用访问者模式解决。
2、UML
Visitor:抽象访问者,为该对象结构中ConcreteElement的每个类声明一个visit操作
ConcreteVisitor:是一个具体的访问者,实现每个有visitor声明的操作,是每个操作实现的部分
ObjectStructure:能枚举它的元素,可以提供一个高层的接口,用来允许访问者访问元素
Element:定义一个accept方法,接收一个访问者对象
ConcreteElement:具体的元素,实现了accept方法
二、访问者设计模式案例
1、介绍
该案例讲述的是当观众看完某个歌手表演后,将观众分为男人和女人分别对歌手进行评测(不及格,及格,待定)
2、UML
Action:是抽象访问者
Fail、Success、Wait:具体的访问者
Person:抽象的访问对象,定义了一个accept方法用来接收访问者
Man、Woman:具体的访问对象
ObjectStructure:数据结构,枚举它的元素,提供一个接口让访问者访问元素
3、代码
/**
* @description: 行为抽象类
* @author: dashu
* @create: 16:30
*/
public abstract class Action {
/**
* 获取评价
*
* @param person 人
*/
public abstract void getResult(Person person);
}
/**
* @description: 及格
* @author: dashu
* @create: 16:34
*/
public class Success extends Action{
/**
* 获取评价
*
* @param person 人
*/
@Override
public void getResult(Person person) {
System.out.println(person.getName() + "给的评价:该歌手成功...");
}
}
/**
* @description: 不及格
* @author: dashu
* @create: 16:34
*/
public class Fail extends Action{
/**
* 获取评价
*
* @param person 人
*/
@Override
public void getResult(Person person) {
System.out.println(person.getName() + "给的评价:该歌手失败...");
}
}
/**
* @description: 待定
* @author: dashu
* @create: 16:34
*/
public class Wait extends Action{
/**
* 获取评价
*
* @param person 人
*/
@Override
public void getResult(Person person) {
System.out.println(person.getName() + "给的评价:该歌手待定...");
}
}
/**
* @description: 人
* @author: dashu
* @create: 16:36
*/
public abstract class Person {
private String name;
public Person(String name){
this.name = name;
}
/**
* 提供一个方法,让访问者可以访问
*
* @param action
*/
public abstract void accept(Action action);
/**
* 获取name
* @return
*/
public String getName(){
return this.name;
}
}
/**
* @description: 男人
* @author: dashu
* @create: 16:37
*/
public class Man extends Person{
public Man(){
super("男人");
}
/**
* 提供一个方法,让访问者可以访问
*
* @param action
*/
@Override
public void accept(Action action) {
action.getResult(this);
}
}
/**
* @description: 女人
* @author: dashu
* @create: 16:38
*/
public class Woman extends Person{
public Woman(){
super("女人");
}
/**
* 提供一个方法,让访问者可以访问
*
* @param action
*/
@Override
public void accept(Action action) {
action.getResult(this);
}
}
/**
* @description: 对象结构
* @author: dashu
* @create: 16:41
*/
public class ObjectStructure {
private List<Person> persons = new LinkedList<>();
/**
* 添加对象
* @param person
*/
public void add(Person person){
persons.add(person);
}
/**
* 删除对象
* @param person
*/
public void remove(Person person){
persons.remove(person);
}
public void display(Action action){
for (Person person : persons) {
person.accept(action);
}
}
}
/**
* @description: 客户端
* @author: dashu
* @create: 16:29
*/
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.add(new Man());
objectStructure.add(new Woman());
Success success = new Success();
objectStructure.display(success);
Fail fail = new Fail();
objectStructure.display(fail);
Wait wait = new Wait();
objectStructure.display(wait);
}
}
ructure.add(new Man());
objectStructure.add(new Woman());
Success success = new Success();
objectStructure.display(success);
Fail fail = new Fail();
objectStructure.display(fail);
Wait wait = new Wait();
objectStructure.display(wait);
}
}