观察者模式类(JAVA)

观察者模式类(JAVA),java,Java,我被这项任务困住了。我得到了一个抽象的观察者类,其中只有一个构造函数,一个带有参数/参数的构造函数。请参阅下文 public static void main(String[] args) { PairOfNumbers numbers1 = new PairOfNumbers(); PairOfNumbers numbers2 = new PairOfNumbers(); SumObserver sum = new Sum

我被这项任务困住了。我得到了一个抽象的观察者类,其中只有一个构造函数,一个带有参数/参数的构造函数。请参阅下文

public static void main(String[] args) {    
    PairOfNumbers numbers1 = new PairOfNumbers();            
    PairOfNumbers numbers2 = new PairOfNumbers();        
    SumObserver sum = new SumObserver(numbers1);        
    ProductObserver prod = new ProductObserver(numbers2);    
    MultiSubjectObserver m = new MultiSubjectObserver();
    m.addSubject(numbers1);
    m.addSubject(numbers2);        
    numbers1.setNumbers(20, 10);
    numbers2.setNumbers(-10, 15);       
}    


class Subject {
    private List<Observer> observers=new ArrayList<Observer>();
    public void attachObserver(Observer observer) {
    this.observers.add(observer);
    }
    public void detachObserver(Observer observer) {
        this.observers.remove(observer);
    }
    public void notifyObservers() {
    for (Observer observer: this.observers)
        observer.update(this);
    }
}   

class PairOfNumbers extends Subject {
    private double number1, number2;
    public double getNumber1() { return this.number1; }
    public double getNumber2() { return this.number2; }
    public void setNumbers(double d1, double d2) {
    this.number1=d1; this.number2=d2;
    this.notifyObservers();  // don't forget to do this!
    }
} 

abstract class Observer {
    public Observer(Subject subject) {
    subject.attachObserver(this);
}

abstract public void update(Subject subject);
}

class SumObserver extends Observer {
    public SumObserver(PairOfNumbers pair) {
    super(pair);
    }
    public void update(Subject subject) {
    PairOfNumbers numbers=(PairOfNumbers)subject;
    System.out.println("New sum is: "+(numbers.getNumber1()+numbers.getNumber2()));
    }
}

class ProductObserver extends Observer {
    public ProductObserver(PairOfNumbers pair) {
        super(pair);        
    }
    public void update(Subject subject) {
   PairOfNumbers numbers=(PairOfNumbers)subject;
   System.out.println("New product is: "+(numbers.getNumber1()*numbers.getNumber2()));
    }
}
有没有办法在MSO类中创建一个不需要参数/参数的构造函数?比如说

public MultiSubjectObserver(){
    //enter code here 
}
请在这一点上指导我。我想了好几天了。提前谢谢!:D

说明是:修改源代码以处理每个观察者的任意数量的主题对象

预期产出:


是的,您可以这样做,创建一个no-arg子类,但是您仍然必须在子构造函数中调用需要超级构造函数的arg

这:

棘手的部分是——在这种默认情况下,向超级构造函数传递什么?在您的情况下,这可能是:

警告:在调用super的构造函数时,由于行subject.attachObserverthis;,这将导致NullPointerException;,所以不,你不能这么做

更好的解决方案:确保MultiSubjectObserver不会从Observer扩展

也许是这样的:

class MultiSubjectObserver {
   private List<Observer> observerList = new ArrayList<Observer>();

   public void addSubject(PairOfNumbers numbers1) {
      observerList.add(new InnerObserver(numbers1));
   }

   private class InnerObserver extends Observer {
      public InnerObserver(Subject subject) {
         super(subject);
      }

      @Override
      public void update(Subject subject) {
         System.out.println("From multi-observer: " + subject);
      }
   }    
}
编辑 根据输出:

class MultiSubjectObserver {
   private static final String FORMAT_STRING = "MultiSubjectObserver activated with numbers: %.1f, %.1f%n";
   private List<Observer> observerList = new ArrayList<Observer>();

   public void addSubject(PairOfNumbers numbers1) {
      observerList.add(new InnerObserver(numbers1));
   }

   private class InnerObserver extends Observer {
      public InnerObserver(Subject subject) {
         super(subject);
      }

      @Override
      public void update(Subject subject) {
         System.out.printf(FORMAT_STRING, ((PairOfNumbers)subject).getNumber1(),  ((PairOfNumbers)subject).getNumber1());
      }
   }
}

虽然那个角色有点卑鄙。我更喜欢toString版本。

是的,如果您也给Observer一个无参数构造函数。@immibis:不是绝对必要的omg!非常感谢你!救了我一天!:@用户3774597:注意我答案底部的警告。为什么您觉得子类需要一个无参数构造函数呢?这是因为在我的主方法中,给定的构造函数是MultiSubjectObserver m=new MultiSubjectObserver;我不允许更改它。对于发布的代码,调用supernull会很快产生NullPointerException。我想知道您是否将指令解释错了。考虑把它们全部发布,以及所有代码。
class Child extends Super {
   public Child() {
      super(args_are_needed);
   }
}
public MultiSubjectObserver(){
    super(null);
}
class MultiSubjectObserver {
   private List<Observer> observerList = new ArrayList<Observer>();

   public void addSubject(PairOfNumbers numbers1) {
      observerList.add(new InnerObserver(numbers1));
   }

   private class InnerObserver extends Observer {
      public InnerObserver(Subject subject) {
         super(subject);
      }

      @Override
      public void update(Subject subject) {
         System.out.println("From multi-observer: " + subject);
      }
   }    
}
@Override
public String toString() {
   return String.format("[%.4f, %.4f]", number1, number2);
}
class MultiSubjectObserver {
   private static final String FORMAT_STRING = "MultiSubjectObserver activated with numbers: %.1f, %.1f%n";
   private List<Observer> observerList = new ArrayList<Observer>();

   public void addSubject(PairOfNumbers numbers1) {
      observerList.add(new InnerObserver(numbers1));
   }

   private class InnerObserver extends Observer {
      public InnerObserver(Subject subject) {
         super(subject);
      }

      @Override
      public void update(Subject subject) {
         System.out.printf(FORMAT_STRING, ((PairOfNumbers)subject).getNumber1(),  ((PairOfNumbers)subject).getNumber1());
      }
   }
}