观察者模式类(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());
}
}
}