在我目前的实现中,我有一个Visitor协议,一个Visitor类和该Visitor类的几个子类,以及要访问的各种对象.一旦被访问的对象接受访问者,他们会调用访问者的访问方法,将其自身传递给参数.访问方法需要一个ID,然后键入 – 转换它并调用
[self performTasksOnObjectClass: (ObjectClass *)object];
作为if / elseif / else块的一部分.这些调用由相关的访问者子类接收,访问者执行对象所需的任何任务.
有没有比这更好的方式来实现访客模式?我不喜欢使用’isKindOfClass’或’isMemberOfClass’调用if / elseif / else块.它看起来很笨拙,不雅.另外,以这种方式实施访问者方法仍然值得吗?被访问的对象仍然可以忽视访问者,但还有其他方法可以实现.
已经提出,代理或类集群可能更适合访问者模式的替代.我有兴趣看看你的想法!
编辑:我实际上在子类中调用了不同的命名方法,我已经做得更清楚了.
解决方法 你可以使用一些内省/反思来使它更清洁一些.您不能重载方法名称,但您可以避免编写如下所示的switch语句:- (voID)performTasks:(ID)object{ Class class = [object class]; while (class && class != [NSObject class]) { Nsstring *methodname = [Nsstring stringWithFormat:@"perform%@Tasks:",class]; SEL selector = NSSelectorFromString(methodname); if ([self respondsToSelector:selector]) { [self performSelector:selector withObject:object]; return; } class = [class superclass]; } [NSException raise:@"Visitor %@ doesn't have a performTasks method for %@",[self class],[object class]];}
您的实际performTasks方法将被命名如下:
- (voID)performFooTasks:(Foo *)foo{ //tasks for objects of class Foo}- (voID)performbarTasks:(bar *)bar{ //tasks for objects of class bar}etc...
注意:如果使用ARC,那么通过以这种方式从字符串创建选择器将会收到虚假的警告,因为它无法在编译时告诉方法参数的保留规则.您可以使用#pragma使这些警告静音,如下所示:
#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:selector withObject:object];#pragma clang diagnostic pop总结
以上是内存溢出为你收集整理的ios – Objective-C中的访问者模式全部内容,希望文章能够帮你解决ios – Objective-C中的访问者模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)