2017-02-01 2 views
-1

Я новичок в дизайне.Как уведомить наблюдателя с 2 аргументами?

Я пытаюсь решить это упражнение с Java о Observer дизайн шаблона: мы имеем точки класс и сегмента класс:

Point{ 
    void translater(int dx,int dy); 
    double distance(Point p); 
} 

Segment{ 
    private double longueur; 
    public Segment(Point ex1,Point ex2){....longueur=ex1.distance(ex2);} 

    public double getLongueur(){} 
} 

Если мы p.translaterx и y смены точки, я хочу Сегмент класс, который будет notif СВА.

Как я могу уведомить наблюдателя с х и у значения?

Примечание: Я не должен изменять метод getLongueur.

+0

Пожалуйста, проверьте http://stackoverflow.com/help/mcve, чтобы узнать, как создать минимальный, полный и проверенный пример – pringi

ответ

0

Вам необходимо сохранить список наблюдателей в классе Point: в вашем случае - список сегментов.

List<Segment> observers = new ArrayList<>(); 

чем создать следующие методы

void addObserver(Segment segment) 
{ 
    observers.add(segment); 
} 

void notifyAll() 
{ 
    for (Segment observer: observers) 
     observer.notify() 
} 

In translater метода, добавьте

notifyAll(); 

В сегменте добавить notify методы

void notify() 
{ 
    longueur=ex1.distance(ex2); 
} 

и добавьте в конструктор следующие строки

ex1.addObserver(this); 
ex2.addObserver(this); 
0

Я могу думать о двух решений:

  1. Зарегистрируйте Segment в качестве слушателя изменений в Point классе.
  2. Использование java.util.Observer и java.util.Observable.
  3. Использование AOP (с точки зрения аспекта) извещения Segment для звонков на метод Point.translater.

Вариант 1 (простой вариант реализации):

  • Создание Listener интерфейса. Просто метод уведомления - это хорошо; для этой простой реализации не требуется никаких параметров.
  • Изменить Segment чтобы реализовать интерфейс Listener.
  • Изменение Point для хранения List из Listener ссылок.
  • Добавить метод addListener на номер Point.
  • Добавить метод removeListener на Point (необязательно).
  • В конструкторе Segment зарегистрируйте сегмент в качестве слушателя с каждым из объектов Point.
  • Хранить a List из Point ссылки в классе Segment. Установите их в конструкторе. Возможно, необходимо сохранить ex1 и ex2 в классе Segment.
  • Изменить метод Point.translater для вызова метода Listener.notify для каждого зарегистрированного listener.`
  • Реализуйте метод notify в Segment пересчитывать значение longueur при вызове.

Вариант 2: делать то же самое, что и выше, но использовать интерфейс java.util.Observer вместо своего Listener интерфейса и имеют Point реализовать java.util.Observable.

Вариант 3: АОП кажется излишним. Я оставляю это решение для решения студентом.