Tag: 访问者模式

generics和访客模式

我对访问者模式和generics有问题。 我有一些抽象的class级,他们的孩子将被访问。 看看这段代码: public abstract class Element extends SomeSuperClass { public void accept(Visitor v) { v.visit(this); } } public interface Visitor { void visit(T element); } 所以我的想法是:我有一些类层次结构(例如, Element是SomeSuperClass的子类)。 我有一些通用的Visitor界面来访问这个层次结构。 现在在这个层次结构的中间是Element类,它是抽象的并且拥有它自己的子类。 现在我希望Element接受其子类的所有访问者,这就是我放这行的原因: public void accept(Visitor v) 但现在我收到错误: 方法访问( capture#1-of ? extends Element )类型为Visitor Visitor不适用于参数( Element )。 我明白了? extends Element ? extends Element不是Element 。 我的问题是:我可以用不同的方式表达我的想法吗? 或者我在这种情况下错过了generics的想法?

两个参数的访客模式

这是一个问题陈述:我们有接口/超级class学生和教师 学生有两个实施/子课程,ScienceStudent和PhysicalEducationStudent 老师有ScienceTeacher和PhysicalEducationTeacher。 我们想要实现一个方法getMeetingPoint(学生,教师t),它根据学生和教师的类型返回他们见面的地方。 例如,如果他们是实验室会见的ScienceStudent和ScienceTeacher ,如果PEStudent和PETeacher他们在地面见面,如果是ScienceStudent和PETeacher ,反之亦然,他们在自助餐厅见面 我们可以编写一个天真的方法,使用instanceof进行检查。 但问题是,当教师或学生扩展并且难以维护时,这变得复杂。 像这样的东西: public class MeetingPointDecider { getMeetingPoint(Student s,Teacher t) { if(s instanceof ScienceStudent && t instanceof ScienceTeacher) { return “Lab”; } else if (s instanceof PhysicalEducationStudent && t instanceof PhysicalEducationTeacher) { return “GRound”; } . . . } } 另一个选择是写一个工厂,它接受一个学生和一个教师,并返回类似MeetingPointDecision [Ground或Lab],但问题仍然存在。 我们可以使用任何好的模式,在添加新类时我们不必修改现有的类(或最小的修改),Say instanceof ScienceStudent我们有ChemistryStudent,PhysicsStudent和ChemistryLab,PhysicsLab。 还有可能添加更多操作,这些操作根据学生和教师类型的不同而有所不同(其中访问者是一个选项,但不确定如何使用两个决策类实现) 有人可以建议一个实现这个的好方法吗? 谢谢!