'observer pattern'에 해당되는 글 2건
- 2009/06/12 Observer Pattern (수정) (2)
- 2009/06/11 Observer Pattern
옵저버패턴...수정에, 수정.. 최대한 이해될때까지!! 어제 올린 것에서 수정한 부분만 올려봅니다.
package
{
public interface ISubject
{
function addObserver(_observer:AbstractObserver): void
function removeObserver(_observer:AbstractObserver): void
function notifyObservers(): void
function setData(_item:Array): void
function start(): void
}
}
"네이버실시간인기검색어를 타이머 인터벌로 제공해주는 서브젝트" 란 임무를 맡은 subject 이기 때문에 클래스 네이밍도 바꿔봤구요.. 이름에 걸맞게 이녀석에게 타이머를 핸들하는 부분도 맡게 해주었습니다. 그리고 API부분은 기존에 INaverSubject 인터페이스는 삭제하고 NaverSearchSubject 도 네이밍을 NaverPopSearchWord 로 바꾸어주고 subject 에서 선언해주었습니다. 타이머를 이용해서 새로운 검색어를 얻어오는 부분은 전부 이곳에서 진행됩니다!.
package
{
import flash.events.TimerEvent;
import flash.utils.Timer;
public class NaverSearchData_on_TimerInterval implements ISubject
{
private var item:Array;
private var observerArray:Array;
private var naverData:NaverPopSearchWord;
private var timer:Timer;
private var init_flag:Boolean = true;
public function NaverSearchData_on_TimerInterval(): void
{
init();
}
private function init(): void
{
naverData = new NaverPopSearchWord();
timer = new Timer(1000, 5);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
timer.start();
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();
}
public function start(): void
{
naverData.initialize();
}
private function timerHandler(e:TimerEvent): void
{
if (init_flag)
{
setData(naverData.getData());
init_flag = false;
}
}
private function timerCompleteHandler(e:TimerEvent): void
{
naverData.initialize();
setData(naverData.getData());
timer.start();
}
}
}
subject 에서 타이머를 가지고 가는바람에 메인이 간단해졌습니다 +_+;
package
{
import flash.display.Sprite;
import flash.text.TextField;
public class Main extends Sprite
{
public function Main(): void
{
init();
}
private function init(): void
{
var searchData:ISubject = new NaverSearchData_on_TimerInterval();
var searchDisplay:AbstractObserver = new FavoriteSearchDisplay();
searchData.addObserver(searchDisplay);
searchData.start();
addChild(searchDisplay);
}
}
}
음.. 여러모로 부족하기 때문에 최대한 이해를 하는게 저의 목표입니다. 또한 한번 더 생각해보기. 계속해서 물음표를 던져보기..으쌰!! 다음 패턴은 지금 책을 3~4번 읽고 있는데 좀만 더 읽어보고..^^;; 옵저버패턴과 마찬가지고 책의 예제로 정리후 알맞은 예제를 선택해봐야겠습니다.
'Design Pattern' 카테고리의 다른 글
| Strategy Pattern (0) | 2009/06/19 |
|---|---|
| Observer Pattern (수정) (2) | 2009/06/12 |
| Observer Pattern (0) | 2009/06/11 |
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 |


