【问题标题】:Implementing Visitor Pattern in Java whit two different return types用两种不同的返回类型在 Java 中实现访问者模式
【发布时间】:2019-08-02 20:40:12
【问题描述】:

我正在尝试在 java 中为具有不同返回类型(int 和 void)的方法的对象结构实现访问者模式(家庭练习,抱歉)。

一个concreteVisitor(即CostAss)返回int,第二个ConcreteVisitor(即drawCosts)返回void(即打印成本)。

我很难理解如何实现这个问题。我不允许在 Employee 接口中创建两个接受方法(一个 int e 一个 void)

【问题讨论】:

  • 那张流程图是从哪里来的?除非更改参数,否则同一方法不能有两种不同的返回类型。
  • 谢谢!这是我的问题。我不明白如何处理这种情况。在一个 ConcreteVisitor 中,我需要返回 int。在第二个 ConcreteVisitor 中,我需要打印值。
  • 如果你能用 Java 解决这个问题。泛型
  • @vincenzopalazzo 我不允许在这个练习中使用泛型(教师心态)
  • @GianniSpear 尝试向您的老师解释他们分享的图表并不完全适合您(我猜是自愿)选择的语言。从网上找一张图(例如en.wikipedia.org/wiki/Visitor_pattern#Java_example),并实现它。你们都会从中受益。

标签: java visitor-pattern


【解决方案1】:

从 Java 的角度来看,这些方法是相同的,因为返回类型不是方法签名的一部分。

该图表不适用于 Java。但是,可以使用泛型来解决它。

interface Employee<T> {
  Optional<T> accept(Visitor visitor);
}

class Assistant implements Employee<Integer> {
  @Override
  public Optional<Integer> accept(Visitor visitor) {
    return Optional.of(100);
  }
}

class Manager implements Employee<Void> {
  @Override
  public Optional<Void> accept(Visitor visitor) {
    return Optional.empty();
  }
}

我不是这个想法的大力支持者,我只是想分享它可以实现的方式。

【讨论】:

    【解决方案2】:

    你可以创建一个方法accept,返回void类型,两个具体的访问者有一个状态,一个例子

    public interface IVisitor {
    
        void visit(Employee employee);
    
        int getStatus();
    }
    
    public class VisitPrint implement IVisitor{
    
        public void visit(Employee employee){
          //todo
        }    
    
        public int getStatus(){
            throw new IllegalArgumentException("Not supported operation");
        }
    }
    
    public class VisitSum implement IVisitor{
    
        int status;
    
        public void visit(Employee employee){
          //todo
        }
    
        public int getStatus(){
            return status;
        }
    }
    
    public interface Employee {
      void accept(Visitor visitor);
    }
    

    这个方案解决了问题,尊重老师的心态。

    【讨论】:

    • public void getStatus(){ return status; } 不起作用
    • 如果你编译它,你会看到...implement 并且从void 方法返回一个int
    • @AndrewTobilko 绝对是的,非常感谢,我犯了分心错误。我认为有状态的访问者是错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多