#java #model-view-controller #observer-pattern
#java #model-view-controller #наблюдатель-шаблон
Вопрос:
У меня есть 3 класса, имена которых являются репрезентативными, и я намерен сделать эту работу в шаблоне mvc.
Ниже приведены классы
public class view {
static int n;
static model Model=new model();
public static void main(String args[]){
Model.show(5);
System.out.println("The value is " n);
}
}
public class model {
public interface Observer{
public void show(int n);
}
protected Observer observer;
public void setObserver(Observer observer) {
this.observer = observer;
}
public void show(int n)
{
System.out.println(n 1);
observer.show(5);
}
}
public class Logger implements model.Observer {
private view View;
public Logger(view View) {
this.View= View;
}
public void show(int n)
{
View.n=n;
}
}
Я ожидал, что это будет работать в следующем порядке
представление вызывает модель, а модель, в свою очередь, вызывает наблюдателя, и наблюдатель устанавливает значение n в представлении. Но это дает мне исключение нулевого указателя в модели, когда я пытаюсь вызвать наблюдателя. Я делаю что-то не так??
Комментарии:
1. Какова цель шаблона наблюдателя здесь?
2. Профессор сказал: «напишите шаблон наблюдателя» 😉
3. Очень сложно читать ваш код, если вы не следуете стандартам Java: статическая модель Model=new model(); должно выглядеть так: статическая модель model=new Model(); тогда вы можете иметь смысл, когда вы делаете model.show(); System.out работает, потому что System.outявляется статическим объектом.
4. ха-ха-ха, не потому, что профессор попросил меня… Я учусь обходиться с MVC
Ответ №1:
setObserver
никогда не вызывается, так observer
и есть null
.
public class view {
static int n;
model Model;
private View(){
Logger logger = new Logger(this);
Model = new model();
Model.setObserver(logger);
}
private void doIt(){
Model.show(5);
System.out.println("The value is " n);
}
public static void main(String args[]){
new View().doIt();
}
}
Комментарии:
1. где я должен установить setObserver ?? Я не уверен, куда мне следует позвонить
2. Учитывая ваш код, ответить на этот вопрос непросто.
Model
нужен экземплярLogger
, ноLogger
нужен экземплярView
, а у вас нет экземпляраView
, так как вы вызываете все изstatic void main
метода. Похоже, вам нужно создать экземплярView
, создать экземплярLogger
передачиView
экземпляра и создать экземплярModel
передачиLogger
экземпляра.3. Спасибо , что было полезно, и я сделал кое- что в том же духе, и это тоже сработало … спасибо за ваши ответы …