Хотелось бы продолжить серию примеров шаблонов проектирования, для общего развития так сказать.
Observer
Данный шаблон проектирования бывает нужен не часто, я бы даже отнес его к логическому использованию, к примеру, при построении и проектировании какой-либо слабо зависимой иерархии объектов. Если проще, когда встает необходимость оповещения совершенно других объектов об изменении некого свойства (поля) какого-то другого объекта.
Благодаря тому, что мы уже узнали из примеров Singleton, Abstract Super Class и Factory можем совместить какие-то моменты и перейти к сути, т.е. созданию модели, которая будет содержать список тех, кого потребуется оповещать, метод оповещения и описание класса, при изменении экземпляров которого, будут оповещать других, слушателей. И так к делу:
package com.vlad.pattern.observer;
import java.beans.PropertyChangeListener;
public interface ObserverModelInterface {
public void addChangeListener(PropertyChangeListener propertyChangeListener);
}
package com.vlad.pattern.observer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
public class ObserverModel implements ObserverModelInterface {
private ArrayList mSomeDatas = new ArrayList();
private ArrayList mPropertyChangeListeners = new ArrayList();
public class SomeData {
private String mValue;
public String getValue() {
return mValue;
}
public void setValue(String value) {
String oldValue = mValue;
mValue = value;
notifyListeners(new PropertyChangeEvent(this, "Value", oldValue, mValue));
}
public SomeData(String value) {
mValue = value;
}
}
public ArrayList getDatas() {
return mSomeDatas;
}
public ObserverModel() {
// for test purpose only
mSomeDatas.add(new SomeData("Hello"));
mSomeDatas.add(new SomeData("Bye"));
}
private void notifyListeners(PropertyChangeEvent event) {
for (PropertyChangeListener propertyChangeListener : mPropertyChangeListeners) {
propertyChangeListener.propertyChange(event);
}
}
public void addChangeListener(PropertyChangeListener propertyChangeListener) {
mPropertyChangeListeners.add(propertyChangeListener);
}
}
package com.vlad.pattern.observer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class ObserverElement implements PropertyChangeListener {
public ObserverElement(ObserverModelInterface observerModelInterface) {
observerModelInterface.addChangeListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
System.out.println(event.getNewValue());
}
}
package com.vlad.pattern.observer;
import org.junit.Test;
import com.vlad.pattern.observer.ObserverModel.SomeData;
public class ObserverTest {
@SuppressWarnings("unused")
@Test
public void test() {
ObserverModel observerModel = new ObserverModel();
ObserverElement observerElement = new ObserverElement(observerModel);
for (SomeData someData : observerModel.getDatas()) {
someData.setValue(someData.getValue() + " Fred");
}
}
}
Вот и все, удачи и спасибо, что заглянули.
No comments:
Post a Comment