- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在维基百科中 sample在 GoF 书中,访问者模式的使用是通过调用某些接受器上的 accept
方法开始的。但是为什么会这样呢?为什么我们不能以所需的接受器作为参数开始调用 visit
方法?我们仍然可以使访问者的行为取决于两种类型——访问者和接受者(双重 dispatch )——并且我们可以消除冗余调用(在我看来)。
下面是示例代码来说明这一点:
public interface Visitor {
void visit(AcceptorA acceptor);
void visit(AcceptorB acceptor);
}
//
// Visitor which sings
//
class SingingVisitor implements Visitor {
public void visit(AcceptorA acceptor) {
System.out.println("sing A");
}
public void visit(AcceptorB acceptor) {
System.out.println("sing B");
}
}
//
// Visitor which talks
//
class TalkingVisitor implements Visitor {
public void visit(AcceptorA acceptor) {
System.out.println("talk A");
}
public void visit(AcceptorB acceptor) {
System.out.println("talk B");
}
}
//
// Acceptor subclasses
//
class AcceptorA implements BaseAcceptor {
}
class AcceptorB implements BaseAcceptor {
}
//
// Launcher class
//
class VisitorMain {
public static void main(String[] args) {
Visitor v = new TalkingVisitor();
AcceptorA a = new AcceptorA();
AcceptorB b = new AcceptorB();
v.visit(a);
v.visit(b);
v = new SingingVisitor();
v.visit(a);
v.visit(b);
}
}
最佳答案
考虑:
class House implements HouseAcceptor {
HouseAcceptor kitchen;
HouseAcceptor livingRoom;
void accept(HouseVisitor visitor) {
visitor.visit(this);
kitchen.accept(visitor);
livingRoom.accept(visitor);
}
}
class Kitchen implements HouseAcceptor {
void accept(HouseVisitor visitor) {
visitor.visit(this);
}
}
class LivingRoom implements HouseAcceptor {
void accept(HouseVisitor visitor) {
visitor.visit(this);
}
}
class SpeakingHouseVisitor implements HouseVisitor {
void visit(HouseAcceptor acceptor) {
System.out.println("Inside a HouseAcceptor");
}
void visit(House acceptor) {
System.out.println("Inside a House");
}
void visit(Kitchen acceptor) {
System.out.println("Inside a Kitchen");
}
void visit(LivingRoom acceptor) {
System.out.println("Inside a LivingRoom");
}
}
...
HouseAcceptor acceptor = new House();
HouseVisitor visitor = new SpeakingHouseVisitor();
...
// Doing it your way
visitor.visit(acceptor);
// Output: Inside a HouseAcceptor
// Doing it the right way
acceptor.accept(visitor);
// Output:
// Inside a House
// Inside a Kitchen
// Inside a LivingRoom
请注意,如果您按照自己的方式进行操作,接受器的运行时类型不会产生影响:将使用静态类型。通过执行双重分派(dispatch),您可以确保使用两种运行时类型。
关于java - 为什么我们通过调用 Acceptor.accept() 而不是 Visitor.visit() 来启动 Visitor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8809511/
我已经使用 boost 实现了一个 SocketServer。此 SocketServer 旨在按如下方式工作: 在一定时间内接受连接 超时后停止处理套接字 这是我的代码: ServerSocket:
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在使用 C++ boost asio 库,我在其中监听套接字上的新连接。获得连接后,我处理请求,然后循环监听另一个套接字上的新连接。 while (true) { tcp::socket
我正在编写基于 boost asio 的代理服务器。在负责接受从浏览器到代理服务器的传入连接的代码部分,我面临着我不完全理解的行为。 所以 - 我正在使用下一个构造函数创建接受器对象: _accept
在尝试运行我的 config.ru 时,我遇到了一个我似乎无法调试的奇怪错误,称为“无接受器”错误。 完整错误信息: eventmachine.rb:572:in `start_tcp_server'
目标: 编译“Acceptor”程序(服务器)。完成后,编译一个“启动器”(客户端),然后打印一个简单的输出,以确认两个应用程序正在相互通信(我已经阅读了 QuickFix 文档并且大部分理解的要求)
使用 QuickFIX/J 1.6.3 我的 QuickFIX/J 接受器出现这种奇怪的行为,我完全不知道为什么。我的接受者正在发送一个测试请求,期待一个心跳,发起者向我发送一个心跳,但我的接受者无论
我试图将成员函数作为 AcceptHandler 传递给 boost::asio 的 async_accept() 方法。我收到一个编译错误: AcceptHandler type requireme
我对 Boost 有点陌生,但我正在尝试创建一个服务器,它可以在给定端口上接受来自客户端的连接。该服务器还应该能够在同一端口上写入客户端。 但是,当我尝试使用 acceptor_.bind() 来实现
我将我的项目(node.js + mongodb)从 Openshift v2 切换到 v3。此外,我在我的项目中使用 v3 的 Starter 版本,并在所有配置中使用 Web 控制台。 部署导致失
我正在尝试并排创建一个 tcp::acceptor 和一个 libtorrent::session,但是在等待来自std::cin。如堆栈跟踪所示,访问冲突发生在 Boost IOCP 实现中。 Wi
我最近开始在一个项目中使用 Boost.Asio,想知道是否有人知道将新创建的套接字的所有权转移到 tcp::acceptor::async_accept 的干净解决方案,这将反过来转移这个所有权接受
我有一个作为守护程序运行的 Sinatra 应用程序,使用 Apache 端口转发在端口 80 和端口 7655 之间进行调解。这在过去一直运行良好。今天,不太好。我不明白为什么。 问题:sudo r
在 Multi-Paxos 算法中,从接受者的角度考虑这个消息流: 接收:准备(N) 回复: promise (N,空) 接收:接受!(N,V1) 回复:接受(N,V1) 接收:接受!(N+1,V2)
我想用 Hunchentoot 的 easy-ssl-acceptor在 LispWorks 中。但是,我看到此类接受器具有以下功能语法 #-:hunchentoot-no-ssl . 这个功能确实存
我正在尝试像这样使用 boost::asio::local::stream_protocol::acceptor : accept_(getIOService(), endpoint_) 这个调用返回
我已经实现了启动 tcp 连接的简单 boost::asio 程序。它在 linux 上运行完美(ubuntu 12.04,boost 1_48,gcc 4.6.4),但不是在 Win7 上(boos
我从 pthread_mutex_lock 得到段错误,这是我的回溯: Program received signal SIGSEGV, Segmentation fault. 0x00007
我在 nginx 上部署了一个 rails 应用程序,使用 capistrano(rails 4、ruby 2.1.2、thin 1.6.2、capistrano 2.1.5)进行瘦身。我通过瘦启动命
我一直在尝试使用 tcp::acceptor 创建一个非阻塞的 TCP 服务器。我在使用 BSD 套接字和 C(++) 之前完成了此操作,但无法使用 boost 设置非阻塞 I/O。 C(++): #
我是一名优秀的程序员,十分优秀!