Observer Pattern

|




음. 히카님께서 지적해주신대로 수정해보려고 했는데 잘 되었는지는 잘 모르겠지만.. 이해가 느린저로써 일단 요기까지 해보았습니다. 왠지 하나가 덜끝난 상태에서 다른 패턴으로 넘어가면 찝찝해서 최대한 생각할 수 있을 때가지 해보고 다음으로 넘어가겠습니다. 일단 ISubject 인터페이스에 setData를 추가했는데요. 이부분은 호스트에서 주제녀석을 추상형으로 지정하다보니 추가하게 되었습니다..
package
{
	public interface ISubject
	{
		function addObserver(_observer:AbstractObserver): void
		function removeObserver(_observer:AbstractObserver): void
		function notifyObservers(): void
		function setData(_item:Array): void
	}
}

 



다음은 호스트가 많이 알고 있을필요 있을까?! 해서 OpenAPI를 쓰는 부분을 모조리 뺐습니다. 나름 인터페이스를 만들어서 했는데..이부분도 왠지 자신이 없다는;;; 음 일단 이렇게 해서 호스트에서 NaverSearchSubject 라는 녀석으로 빼는 작업을 했습니다.

package
{
	public interface INaverSubject
	{
		function initialize(): void
		function getData(): Array
	}
}

 



다음은 3번에 관한 부분입니다. 옵저버를 추상인터페이스로 구현하지 않고 추상클래스로 상속받게 하려고 만든 클래스입니다.

package
{
	import flash.display.Sprite;
	
	public class AbstractObserver extends Sprite
	{
		public function AbstractObserver(): void	{ }
		public function update(_item:Array): void	{ }
	}
}
package
{
	public interface IDisplayElement
	{
		function display(): void
	}
}

 



이부분은 특별히 바뀐건 없고 옵저버를 AbstractObserver 를 상속받게 하였습니다.

package
{
	public class FavoriteSearchDisplay extends AbstractObserver implements IDisplayElement
	{
		private var item:Array;
		
		public function FavoriteSearchDisplay()
		{
		}
		
		public override function update(_item:Array): void
		{
			this.item = _item;
			display();
		}
		
		public function display(): void
		{
			for (var i:Number = 0; i < item.length; i++)
			{
				parent["text" + i].text = (i + 1) + ".  " + item[i];
			}
		}
	}
}

 



역시 이부분도 바뀐 부분은 없습니다..;

package
{
	public class SearchData implements ISubject
	{
		private var item:Array;	
		private var observerArray:Array;
		
		public function SearchData()
		{
			observerArray = new Array();
		}
 
		public function addObserver(_observer:AbstractObserver):void
		{
			observerArray.push(_observer);
		}
		
		public function removeObserver(_observer:AbstractObserver):void
		{
			var numberOfObserver:uint = observerArray.indexOf(_observer);
			
			if (numberOfObserver >= 0)
			{
				observerArray.splice(numberOfObserver, 1);
			}
		}
		
		public function notifyObservers():void
		{
			for each (var observer:AbstractObserver in observerArray)
			{
				observer.update(item);
			}
		}
		
		public function setData(_item:Array):void
		{
			this.item = _item;
			notifyObservers();
		}
	}
}

 



네. 이부분이 바로 기존의 호스트에 있던 API부분을 띄어낸 부분입니다. 특별히 수정한부분은 없고 Array데이터를 얻어올 수 있게 getData메소드를 만들어 주었습니다.

package
{
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	
	public class NaverSearchSubject implements INaverSubject
	{
		private var url:String = "네이버API주소";
		private var urlLoader:URLLoader;
		private var request:URLRequest;
		
		private var dataArray:Array;
		private var xml:XML;
		
		public function NaverSearchSubject(): void
		{
			urlLoader = new URLLoader();
			request = new URLRequest(url);
		}
		
		public function initialize(): void
		{
			urlLoader.load(request);
			urlLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
		}
		
		private function loadCompleteHandler(e:Event): void
		{
			dataArray = new Array();
			xml = XML(e.target.data);
			var childItems:XMLList = XMLList(xml.item.children().child(0));
			for each (var itemList:String in childItems)
			{
				dataArray.push(itemList);
			}
		}
		
		public function getData(): Array
		{
			return dataArray;
		}
	}
}

 



마지막으로..메인입니다. 음. 확실히 API부분을 떼어버리니 깔끔한것 같네요...+_+;;; 일단 구상클래스를 추상형으로 선언하였습니다.음..그리고 다른건 없고 5초마다 NaverSearchSubject 녀석한테서 data를 얻어와서 주제녀석에게 알려주게 했습니다..

package
{
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.text.TextField;
	import flash.utils.Timer;

	public class Main extends Sprite
	{
		private var searchData:ISubject;
		private var searchDisplay:AbstractObserver;
		private var naverData:INaverSubject;
		
		private var timer:Timer;
		private var init_flag:Boolean = true;
		
		public function Main()
		{
			init();
			timer = new Timer(1000, 5);
			timer.addEventListener(TimerEvent.TIMER, timerHandler);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
			timer.start();
		}
		
		private function init(): void
		{
			naverData = new NaverSearchSubject();
			searchData = new SearchData();
			searchDisplay = new FavoriteSearchDisplay();
			
			naverData.initialize();
			searchData.addObserver(searchDisplay);
			addChild(searchDisplay);
		}
		
		private function timerHandler(e:TimerEvent): void
		{
			if (init_flag)
			{
				searchData.setData(naverData.getData());
				init_flag = false;
			}
		}
		
		private function timerCompleteHandler(e:TimerEvent): void
		{
			naverData.initialize();
			searchData.setData(naverData.getData());
			timer.start();
		}
	}
}
이상. 옵저버패턴을 이용한 실시간검색순위 수정버전이었습니다...^^;;;; 정신없이 했더니 잘되었는지 모르겠네요..ㅠ..ㅠ 허접하나 보시는분들은 참고가 되시길. 그리고 지적 또한 부탁드립니다.(__)..아웅 졸립군요..zZ

'Design Pattern' 카테고리의 다른 글

Strategy Pattern  (0) 2009/06/19
Observer Pattern (수정)  (2) 2009/06/12
Observer Pattern  (0) 2009/06/11
Trackback 1 And Comment 0
prev | 1 ... | 3 | 4 | 5 | 6 | 7 | next