Tuesday, August 16, 2011

Шаблоны проектирования - Observer

Привет всем заглянувшим.

Хотелось бы продолжить серию примеров шаблонов проектирования, для общего развития так сказать.

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