- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
begin 2023年04月02日15:56:19 。
悲观者往往正确,乐观者往往成功 。
Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. 。
表示在对象结构的元素上执行的操作。访问者模式(Visitor)允许您定义一种新操作,而无需更改它所作用的元素的类。——《设计模式:可复用面向对象软件的基础》 。
访问者模式是一种行为型设计模式.
- an object structure contains many classes of objects with differing
interfaces, and you want to perform operations on these objects that depend
on their concrete classes.- many distinct and unrelated operations need to be performed on objects in
an object structure, and you want to avoid "polluting" their classes with
these operations. Visitor lets you keep related operations together by
defining them in one class. When the object structure is shared by many
applications, use Visitor to put operations in just those applications that
need them.- the classes defining the object structure rarely change, but you often want
to define new operations over the structure. Changing the object structure
classes requires redefining the interface to all visitors,which is
potentially costly. If the object structure classes change often, then it's
probably better to define the operations in those classes.
访问者模式结构图:
抽象访问者角色(Visitor):
具体访问者角色(ConcreteVisitorA、ConcreteVisitorB):
对象结构角色(ObjectStructure):
抽象元素角色(Element):
具体元素角色(ConcreteElementA、ConcreteElementB):
生命主要分为过去、现在、未来,乐观者看到不念过去,不畏将来,立足现在努力,悲观者看到悔恨过去,迷茫未来,或不知所措的现在,同样的生命不同的人看到不同的世界.
代码示例类图:
代码示例:
抽象访问者角色:
// 人类
public interface Man {
void visitPast(Past past);
void visitPresent(Present present);
void visitFuture(Future future);
}
具体访问者角色:
// 乐观主义者
public class Optimist implements Man {
@Override
public void visitPast(Past past) {
System.out.println("不念" + past.getName());
}
@Override
public void visitPresent(Present present) {
System.out.println("享受" + present.getName());
}
@Override
public void visitFuture(Future future) {
System.out.println("不畏" + future.getName());
}
}
// 悲观主义者
public class Pessimist implements Man {
@Override
public void visitPast(Past past) {
System.out.println("悔恨" + past.getName());
}
@Override
public void visitPresent(Present present) {
System.out.println("焦虑" + present.getName());
}
@Override
public void visitFuture(Future future) {
System.out.println("迷茫" + future.getName());
}
}
对象结构角色:
// 生命
public class Life {
private List<Time> timeList = new ArrayList<>();
public Life() {
timeList.add(new Past());
timeList.add(new Present());
timeList.add(new Future());
}
public void visitTime(Man man) {
for (Time time : timeList) {
if (time instanceof Past) {
man.visitPast((Past) time);
} else if (time instanceof Present) {
man.visitPresent((Present) time);
} else if (time instanceof Future) {
man.visitFuture((Future) time);
}
}
}
}
抽象元素角色:
// 时间
public interface Time {
void accept(Man man);
String getName();
}
具体元素角色
// 过去
public class Past implements Time {
private String name = "过去";
@Override
public void accept(Man man) {
man.visitPast(this);
}
public String getName() {
return name;
}
}
// 现在
public class Present implements Time {
private String name = "现在";
@Override
public void accept(Man man) {
man.visitPresent(this);
}
public String getName() {
return name;
}
}
// 未来
public class Future implements Time {
private String name = "未来";
@Override
public void accept(Man man) {
man.visitFuture(this);
}
public String getName() {
return name;
}
}
客户端
public class Client {
public static void main(String[] args) {
Optimist optimist = new Optimist();
Pessimist pessimist = new Pessimist();
Life life = new Life();
System.out.println("乐观者:");
life.visitTime(optimist);
System.out.println("悲观者:");
life.visitTime(pessimist);
}
}
结果:
乐观者:
不念过去
享受现在
不畏未来
悲观者:
悔恨过去
焦虑现在
迷茫未来
访问者莫斯允许您定义一种新操作,而无需更改它所作用的元素的类。访问者模式适用于结构固定,但是操作不固定的对象,它把对象结构和作用于结构的操作耦合解开,方便增加新的操作.
end 2023年04月05日15:22:07 。
最后此篇关于访问者模式的文章就讲到这里了,如果你想了解更多关于访问者模式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试为玩具语言实现一个解析器。 我已经编写了语法,但是当我尝试从 CST 创建 AST 时遇到了问题。 我定义了一个继承自 MyParserVisitor 的类哪里ASTNode是一个虚拟类,我
我想创建子类对象,它会与其他子类对象做出不同的 react (类可以欢迎另一个类,但不是全部)代码原理源自访客设计模式: class A { public : virtual bool isW
我正在玩 boost A* 算法,从在以下位置找到的示例开始:http://www.boost.org/doc/libs/1_37_0/libs/graph/example/astar-cities.
我正在为我的网站构建一个访问者和点击率计数器,当然,访问者每天是一个唯一的 ip,点击率是每次请求页面时! 我已经创建了数据库和系统来插入和更新我保存统计信息的表! 我正在苦苦挣扎的是,如何对日期进行
如何放弃使用 IE6 浏览我的网站? 就像是 : 如果 ie6 => 死 我正在使用 ASP.Net 谢谢 最佳答案 在asp.net中你可以查看Request.Browser在 Session_st
我目前正在编写解析器。解析器生成一个 AST,然后我使用各种遍历来处理它。 AST 是(简化的): type LiteralExpr = { readonly kind: 'literal',
我正在使用 Antlr4 的 C++ 访问者 api 来遍历解析树。但是,我正在努力使其正常运行。也就是说,我不确定如何使用 visitChildren(ParseTree *tree) 调用。 我为
我的问题是理论性的,而不是如何去做。我想知道专家们如何处理我将在下面描述的情况。 我有一个使用 Angular 和 Breeze 的 SPA。身份验证是基于 token 的。我在 Angular 中设
我有一棵树(在图形意义上)表示一棵树(在物理意义上)。树表示为 BGL 邻接列表,其中每个顶点包含半径和位置属性,即,我的图以以下形式定义 struct TreeVertexType { doub
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
是否可以将域限制为仅允许使用特定浏览器的访问者? 我正在构建一个应用程序,到目前为止它只在 Chrome 中进行过测试,所以我只想在 Beta 测试期间允许 Chrome 用户。基本上,我想在进行测试
你好,我正在尝试实现一个 AST Clang 访问者,这是我的代码。 class ExampleVisitor : public RecursiveASTVisitor { private:
我想构建一个访问者(用于 dikstra),并将 initialise_vertex 用作“颜色映射”修饰符。我想根据条件从搜索中排除一些顶点。所以我想在算法的初始部分将一些顶点设置为“黑色”。 cl
我正在尝试编写一个网站,提示每 10,000 名访问者输入一封可以存储在文本文件中的电子邮件。 我设置了一个点击计数器,它将访问者总数输出到一个文本文件中,因此是否可以将脚本设置为类似于 "如果 nu
我正在尝试将 AST 与 ANTLR4 一起使用,并使用以下文件: 生成器.java import org.antlr.v4.runtime.ANTLRInputStream; import org.
在 BGL 中,我不太明白如何在 bfs/dfs 搜索期间访问图中顶点的固有颜色(白色表示未触及,灰色表示已访问,黑色表示已完成)。 有人可以说明如何从 dfs/bfs 访问者中访问顶点的颜色吗?例如
当用户访问您的网站时,如何获取用户的信息? IP地址 苹果地址 用户个人资料名称 操作系统名称 操作系统版本 操作系统注册到(姓名/公司) 计算机名 浏览器名称 浏览器版本 ISP 名称/Intern
我最近开始使用 Amazon S3 为访问者提供图像,因为这会减少服务器负载。现在,出现了一个新问题:今天我查看了我的 AWS 账单。我注意到我有一大笔账单等着我——20 天内总共有 4TB 的 AW
session 劫持 所以我有一个小问题。我正在尝试识别访问者,这很难通过 $_SERVER veriables 来实现,如以下问题所述:Preventing session hijacking .
我有一个带有两个边定义的图,如下所示: isDepartment: [organisation] -> [organisation] hasAccess: [user] -> [organisatio
我是一名优秀的程序员,十分优秀!