Хотелось бы продолжить серию примеров шаблонов проектирования, для общего развития так сказать.
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 ArrayListmSomeDatas = 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