음. 히카님께서 지적해주신대로 수정해보려고 했는데 잘 되었는지는 잘 모르겠지만.. 이해가 느린저로써 일단 요기까지 해보았습니다. 왠지 하나가 덜끝난 상태에서 다른 패턴으로 넘어가면 찝찝해서 최대한 생각할 수 있을 때가지 해보고 다음으로 넘어가겠습니다. 일단 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


