24-访问者模式
24-访问者模式
概念
访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的前提下定义作用于这些元素的新操作
访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用域结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化
访问者模式的目的是要把处理从数据结构分离出来,系统有比较稳定的数据结构,又有容易变化的算法的话,使用访问者模式就是边角合适的,因为访问者模式使得算法操作的增加变得容易
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关行为集中到一个访问者对象中。
实践
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public abstract class Person {
public abstract void accept(Action visitor);
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class Woman extends Person {
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class Man extends Person {
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public abstract class Action {
public abstract void getManConclusion(Man man);
public abstract void getWomanConclusion(Woman woman);
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class Failing extends Action {
@Override
public void getManConclusion(Man man) {
System.out.println(man.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,闷头喝酒,谁也不用劝。");
}
@Override
public void getWomanConclusion(Woman woman) {
System.out.println(woman.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,眼泪汪汪,谁也劝不了。");
}
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class Success extends Action {
@Override
public void getManConclusion(Man man) {
System.out.println(man.getClass().getSimpleName() + " " + getClass().getSimpleName() + " " + "时,背后多半有一个伟大的女人。");
}
@Override
public void getWomanConclusion(Woman woman) {
System.out
.println(woman.getClass().getSimpleName() + " " + getClass().getSimpleName() + " " + "时,背后多半有一个不成功的男人。");
}
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class Love extends Action {
@Override
public void getManConclusion(Man man) {
System.out.println(man.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,凡事不懂也要装懂。");
}
@Override
public void getWomanConclusion(Woman woman) {
System.out.println(woman.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,遇事懂也装不懂。");
}
}
package com.gof.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class ObjectStructure {
private List<Person> elements = new ArrayList<>();
public void add(Person person) {
elements.add(person);
}
public void remove(Person person) {
elements.remove(person);
}
public void display(Action visiter) {
for (Person per : elements) {
per.accept(visiter);
}
}
}
package com.gof.visitor;
/**
* 功能描述
*
* @since 2023-03-11
*/
public class Client {
public static void main(String[] args) {
Success success = new Success();
Failing failing = new Failing();
Love love = new Love();
Man man = new Man();
Woman woman = new Woman();
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.add(man);
objectStructure.add(woman);
objectStructure.display(love);
objectStructure.display(failing);
objectStructure.display(success);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端