이번에는 Strategy Pattern 에 대해서 좀 적어보려고 합니다.
간단하게 책에서 정의한 내용을 보면..
정의만으론 뭔가 확 다가오지 않죠?..^^;; 이제 차근차근 예제를 들어 보겠습니다.
우선 Strategy Pattern 은 어떤 경우에 사용하는게 좋을까요? 제가 생각해본 예는 여러 드로잉툴의 "저장"을 하는부분입니다.
한 예로 포토샵을 생각해보면 우리는 새창을 띄워서 작업을 한 후에 저장을 하게 되는데요.. 유저는 저장을 할때 포맷을 지정하여 저장하게 됩니다. jpg, png, bmp 등이 있겠죠?. 그래서 여러 포맷으로 저장하는 방법을 알고리즘군으로 정의하게 됩니다.
그럼 저장 알고리즘의 인터페이스를 볼까요.
다음은 저장알고리즘들의 구상클래스입니다. 차례대로 jpg저장, bmp저장, png저장입니다.
다음은 DrawingTool 클래스입니다.
다음은 PhotoShop 클래스입니다. 이부분도 Strategy Pattern의 장점이라고 생각되는데요. PhotoShop뿐만 아니라 Illurstrator등 다른 드로잉프로그램에서도 적용하여 저장기능을 사용할 수 있을 거라고 생각합니다.
마지막으로 Main에서는 드로잉툴을 등록하고 저장을 실행시키고, 새로운 포맷으로 교체해서 저장도 할 수 있게 해줍니다.
음... 위에서는 저장만을 가지고 예를 들었지만. 로드하는 부분도 똑같이 쓸 수 있다고 생각합니다. 그러면 포맷별로 로드하는 방법을 알고리즘군으로 만들고 ILoad 인터페이스를 구현해서 만들면 될거 같습니다. ^^;
마지막으로 제가 생각한 장점을 살짝 정리를 하자면. 새로운 포맷이 추가될때는 ISave에 맞춰서 그에 맞는 포맷구상클래스를 만들어 주어 확장성을 열어주는 점. 또한 저장이나, 로드등 이러한 기능들을 드로잉툴이라면 새로 구현하지 않아도 쉽게 가져다가 쓸 수 있을거라는 생각을 하게 되었습니다.
음..실제로 구체적으로 구현한것이 아니라 trace로 엉성한 마무리를 지었습니다...^^;; 괜찮은 예제를 또 생각해보고 직접 구현해보아야겠어요. 실제로 부딪히는 문제들이 많을테니까요.. :ㅇㄷㄷ 그럼 이상 Strategy Pattern 이었습니다.(__)
간단하게 책에서 정의한 내용을 보면..
Strategy Pattern 에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. - Head First -
정의만으론 뭔가 확 다가오지 않죠?..^^;; 이제 차근차근 예제를 들어 보겠습니다.
우선 Strategy Pattern 은 어떤 경우에 사용하는게 좋을까요? 제가 생각해본 예는 여러 드로잉툴의 "저장"을 하는부분입니다.
한 예로 포토샵을 생각해보면 우리는 새창을 띄워서 작업을 한 후에 저장을 하게 되는데요.. 유저는 저장을 할때 포맷을 지정하여 저장하게 됩니다. jpg, png, bmp 등이 있겠죠?. 그래서 여러 포맷으로 저장하는 방법을 알고리즘군으로 정의하게 됩니다.
그럼 저장 알고리즘의 인터페이스를 볼까요.
package
{
public interface ISave
{
function save(): void
}
}
저장인터페이스의 기능은 각각 실행해야하는 포맷들의 저장 로직군을 대변하고 있죠. 또한 이렇게 추상화함으로써 클라이언트에서는 저장이란것만 알고 있고 어떠한 저장포맷들이 있는지 몰라도 되게 됩니다.다음은 저장알고리즘들의 구상클래스입니다. 차례대로 jpg저장, bmp저장, png저장입니다.
package
{
public class SaveForJpeg implements ISave
{
public function SaveForJpeg()
{
}
public function save(): void
{
trace("Jpeg 포맷으로 저장합니다.");
}
}
}
package
{
public class SaveForBmp implements ISave
{
public function SaveForBmp()
{
}
public function save(): void
{
trace("Bmp 포맷으로 저장합니다.");
}
}
}
package
{
public class SaveForPng implements ISave
{
public function SaveForPng()
{
}
public function save(): void
{
trace("Png 포맷으로 저장합니다.");
}
}
}물론 jpg로 저장하는데 save()로 끝나진 않겠죠...여러 인자들이 들어가겠죠? ^^;;..다음은 DrawingTool 클래스입니다.
package
{
public class DrawingTool
{
protected var kindOfSave:ISave;
public function DrawingTool()
{
}
public function display(): void
{
throw new Error("오버라이드 오네가이시마스");
}
public function performSave(): void
{
kindOfSave.save();
}
public function setKindOfSave(_kindOfSave:ISave): void
{
kindOfSave = _kindOfSave;
}
}
}
드로잉툴이라면 갖춰야 할부분들을 구현합니다. 또한 저장기능을 구체적으로 선언하지 않고 추상형으로 하여 유연하게 바꿀수 있게 하였습니다.다음은 PhotoShop 클래스입니다. 이부분도 Strategy Pattern의 장점이라고 생각되는데요. PhotoShop뿐만 아니라 Illurstrator등 다른 드로잉프로그램에서도 적용하여 저장기능을 사용할 수 있을 거라고 생각합니다.
package
{
public class PhotoShop extends DrawingTool
{
public function PhotoShop()
{
kindOfSave = new SaveForJpeg();
}
public override function display(): void
{
trace("저는 포토샵입니다. ^^;;");
}
}
}
마지막으로 Main에서는 드로잉툴을 등록하고 저장을 실행시키고, 새로운 포맷으로 교체해서 저장도 할 수 있게 해줍니다.
package {
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main()
{
var photoShop:DrawingTool = new PhotoShop();
photoShop.display();
photoShop.performSave();
photoShop.setKindOfSave(new SaveForPng());
photoShop.performSave();
}
}
}
음... 위에서는 저장만을 가지고 예를 들었지만. 로드하는 부분도 똑같이 쓸 수 있다고 생각합니다. 그러면 포맷별로 로드하는 방법을 알고리즘군으로 만들고 ILoad 인터페이스를 구현해서 만들면 될거 같습니다. ^^;
마지막으로 제가 생각한 장점을 살짝 정리를 하자면. 새로운 포맷이 추가될때는 ISave에 맞춰서 그에 맞는 포맷구상클래스를 만들어 주어 확장성을 열어주는 점. 또한 저장이나, 로드등 이러한 기능들을 드로잉툴이라면 새로 구현하지 않아도 쉽게 가져다가 쓸 수 있을거라는 생각을 하게 되었습니다.
음..실제로 구체적으로 구현한것이 아니라 trace로 엉성한 마무리를 지었습니다...^^;; 괜찮은 예제를 또 생각해보고 직접 구현해보아야겠어요. 실제로 부딪히는 문제들이 많을테니까요.. :ㅇㄷㄷ 그럼 이상 Strategy Pattern 이었습니다.(__)
'Design Pattern' 카테고리의 다른 글
| Strategy Pattern (0) | 2009/06/19 |
|---|---|
| Observer Pattern (수정) (2) | 2009/06/12 |
| Observer Pattern (0) | 2009/06/11 |
Trackback 0 And
Comment 0


