用访客模式在Java中实现toString方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用访客模式在Java中实现toString方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2715字,纯文字阅读大概需要4分钟。
内容图文
这是我的一些Java代码
public List<OBJ> a = new ArrayList<OBJ>();
public String A;
public String B;
public String C;
for (OBJ o : a) {
// .... TODO
}
因此,我有一个接口OBJ,并且有三个实现OBJ的对象,即X,Y,Z.因此,我将X / Y / Z对象存储在列表a中.现在说我想遍历循环,如果o是实例X,则将X.value存储在A中,如果Y将Y.value存储在B中,如果Z将Z.value存储在C中,那么问题实际上是怎么办您可以确定o是(X,Y,Z)的对象类型,以便将它们的值存储在正确的字符串中.
注意:我想使用Visitor pattern或类似的东西,但是我对它并没有真正的把握,所以我需要您的帮助.
这意味着没有Instanceof(s)或类型强制转换,也没有专用的方法,例如
interface OBJ {
void blah();
}
class X implements OBJ {
public void blah();
} // etc
谢谢!我真的很想了解软件工程的这一重要方面!
嘿哇,谢谢您的详细和快速的回??复,但是我的情况更加复杂,抱歉,我之前没有添加.
因此,字符串A,B,C实际上位于另一个类中,例如
class ARGH {
public List<OBJ> a = new ArrayList<OBJ>();
public String A;
public String B;
public String C;
//invisible constructor here
public String toString () {
for (OBJ o : a) {
// .... TODO
}
return "some string"
}
}
public void main (String[] args) {
ARGH argh = new ARGH();
// Setup some X, Y, Z objects and their values here
String D = argh.toString();
// Do something to D
}
所以Strings和List实际上不是全局变量,所以我认为这不起作用:
ObjVisitor v = new ObjVisitor() {
@Override
public void visit(X x) {
A = x.value();
}
// And so on.
}
我以为我必须以某种方式将字符串A,B,C传递给visit方法,但是我不知道该怎么做,仍然停留在Visitor Pattern中.
解决方法:
简而言之,您会这样做:
>创建带有每种类型一个访问方法的Visitor界面ObjVisitor.
>将抽象accept(ObjVisitor v)添加到OBJ.
>添加一个accept(ObjVisitor v){v.visit(this); }到每个OBJ实现.
>在循环中调用o.accept(yourVisitorImpl).
您确实确实从Bringer128获得了一些代码.我详细说明并添加了String-stuff.
import java.util.*;
interface OBJ {
String accept(ObjVisitor v);
}
interface ObjVisitor {
String visit(X x);
String visit(Y y);
String visit(Z z);
}
class X implements OBJ {
public String accept(ObjVisitor v){ return v.visit(this); }
}
class Y implements OBJ {
public String accept(ObjVisitor v) { return v.visit(this); }
}
class Z implements OBJ {
public String accept(ObjVisitor v) { return v.visit(this); }
}
用法:
class Test {
public static void main(String[] args) {
List<OBJ> objs = Arrays.asList(new Z(), new X());
ObjVisitor toStringVisitor = new ObjVisitor() {
public String visit(X x) { return "X object"; }
public String visit(Y y) { return "Y object"; }
public String visit(Z z) { return "Z object"; }
};
String result = "";
for (OBJ o : objs)
result += o.accept(toStringVisitor) + "\n";
System.out.println(result);
// Prints
// Z object
// X object
}
}
一种替代方法(也许是更好的方法)是让访问者实现维护一个StringBuilder,让访问方法返回void,然后在循环之后仅调用stringVisitor.getCurrentString()或类似的方法.
内容总结
以上是互联网集市为您收集整理的用访客模式在Java中实现toString方法?全部内容,希望文章能够帮你解决用访客模式在Java中实现toString方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。