Strategy Pattern 동일목적알고리즘의선택적용문제 Service Innovation
Key Features of Patterns Item Name Intent Problem Solution Participants and collaborators Consequences implementation Generic structure Description All patterns have a unique name that identifies them. The purpose of the pattern. The problem that the pattern is tying to solve. How the pattern provides a solution to the problem in the context in which it shows up. The entities involved in the pattern. The consequences of using the pattern. How the pattern can be implemented. Note: implementations are just concrete manifestations of the pattern and should not be constructed as the pattern itself. A standard diagram that shows a typical structure for the pattern. 2
Structural Pattern Strategy Pattern Structural Pattern are concerned with how classes and objects are composed to form larger structure. Structural class patterns (Static fixed at compile time) use inheritance to compose interfaces or implementation. Structural object patterns (dynamic can be changed at runtime) Rather than composing interfaces or implementations, these describe ways to compose objects to realize new functionality. The added flexibility of object composition comes from the ability to change the composition at run-time, which is impossible with static class composition. Strategy Pattern Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. S c o p e Class (Static) Object (Dynamic) Creation Factory Method Abstract Factory Builder Prototype Singleton Adapter (Class) Adapter (object) Bridge Composite Decorator Façade flyweight Proxy Objective Structure Behavior Interpreter Template Method Chain of Responsibility Command, Iterator, Mediator, Memento, Observer State Strategy Visitor 3
SimUDuck 애플리케이션 SimUDuck 오리연못시뮬레이션게임 객체지향기법으로 Duck 이라는수퍼클래스를만들고, 그클래스를확장하여다른모든종류의오리를구현 모든오리들이꽦꽥소리를낼수있고 [quark()] 헤엄칠수있기때문에 [swim()] 수퍼클래스에서간단한코드를구현. Duck quack() swim() display() // // 기타기타오리관련메소드 모든오리모양이다르기때문에 display() 메소드는추상메소드임 각형식별로자기모양을화면에보여주기위한 display() 메소드를별도로구현함. MallardDuck display() {{ // // 적당한모양을표시표시 }} RedheadDuck display() {{ // // 적당한모양을표시표시 }} 다른수많은유형의오리 4
변경 변경사항 오리들이날아다닐수있도록수정 Duck 클래스에 fly() 메소드만추가하면모든오리들이간단하게상속받아날수있다! 모든서브클레스에서 fly() 를상속받음. Duck quack() swim() display() fly() // // 기타오리관련메소드 MallardDuck display() {{ // // 적당한모양을표시표시 }} RedheadDuck display() {{ // // 적당한모양을표시표시 }} 기타 Duck 서브클래스 5
원치않는결과 (Unwanted side effect) 코드의한부분만을바꿈으로해서프로그램전체에부작용 ( 날아다니는고무오리 ) 이발생 전코드를알던지 ( 불가능!), 디자인을바꾸던지 Duck quack() swim() display() fly() // // 기타기타오리관련메소드 수퍼클래스에 fly() 메소드를넣은결과, 날아다니면안될오리들을포함한모든오리들한테날아다니는기능이추가되었음. MallardDuck display() {{ // // 적당한모양을표시표시 }} RedheadDuck display() {{ // // 적당한모양을표시표시 }} RubberDuck quack() {{ // // 삑삑삑삑소리를내도록 // // 오버라이드 }} display() {{ // // 적당한모양을표시표시 }} 6
상속이모든것의해결책은아니다! 상속이모든것의해결책은아니다! 서브클래스에서코드가중복된다 실행시에특징을바꾸기힘들다 모든오리의행동을알기힘들다 코드를변경했을때다른오리들한테원치않은영향을끼칠수있다. DecoyDuck quack() { // // 아무아무것도것도 // // 하지하지않도록 // // 오버오버라이드 }} display() {// {// 가짜오리 }} fly() {{ // // 아무아무것도것도 // // 하지하지않도록 // // 오버라이드 }} Duck quack() swim() display() fly() MallardDuck display() {{ // // 적당한모양을표시표시 }} // // 기타기타오리관련메소드 RubberDuck quack() {{ // // 삑삑삑삑 }} display() {// 고무오리 }} fly() {{ // // 아무아무것도것도 // // 하지하지않도록 // // 오버라이드 }} 7
인터페이스는? 모든서브클래스가날거나꽥꽥거리는기능이있어야하는것은아니므로상속을사용하는것은올바른해결책이아님. 서브클래스에서 flayble, Quackable을구현하도록함으로써일부문제점은해결, 그러나코드재사용이불가하여코드관리의또다른문제점발생. 나중에고쳐야할때도기존코드에미치는영향은최소한으로줄이면서작업을할수있는방법이필요함. 8
인터페이스란 Interface 는클래스와유사한 reference type 이나 constants, method signatures, 및 nested types 만포함할수있으며 method bodies 가없음. Interfaces 는인스턴스화될수없으며클래스에의해구현 (implemented) 되거나다른인터페이스에의해확장 (extended) 될수만있음. 9
달라지는부분을 캡슐화 하기 상속 서브클래스마다행동이바뀔수있는것을상속하면모든서브클래스에서한행동을사용하게됨. 인터페이스 인터페이스에서는구현된코드가전혀들어가지않기에코드재사용을할수없음. 즉, 한행동을바꿀때마다그행동이정의되어있는서로다른서브클래스들을전부찾아서코드를일일이고쳐야하고, 그과정에서새로운버그가생길가능성이있음. 디자인원칙애플리케이션에서달라지는부분을찾아내고,, 달라지지않는부분으로부터분리시킨다.. 바뀌는부분은따로뽑아서캡슐화함. 그렇게하면나중에바뀌지않는부분에는영향을미치지않은채로그부분만고치거나확장할수있음. 모든패턴은 시스템의일부분을다른부분과독립적으로변화시킬수있는방법 을제공함. 10
바뀌는부분과그렇지않은부분분리하기 fly() 와 quack() 은여차클래스에서오리마다달라지는부분임. 이러한행동을 Duck 클래스로부터갈래내기위해서그두메소드를모두 Duck 클래스로부터끄집어내서각행동을나타낼클래스집합을새로만듦 여차클래스는여전히모든오리들의수퍼클래스이지만나는행동과꽥꽥거리는행동을끄집어내서다른클래스구조에집어넣음. 이제나는것과꽥꽥거리는것에대해별도의클래스의집합이생겼음. 여기에는다양한메소드구현이들어감. 11
인터페이스에맞춰서프로그래밍하자 실제실행시에쓰이는객체가코드에의해고정되지않도록, 어떤상위행식 (super class) 에맞춰서프로그래밍함으로써다형성을활용함. 구현에맞추는프로그래밍 Dog d = new Dog(); d.bark 인터페이스 / 상위형식에맞추는프로그래밍 Animal animal = new Dog(); animal.makesound(); 추상상위형식 ( 추상클래스또는인터페이스 ) 상위형식의인스턴스를만드는과정을직접코드로만드는대신구체적으로구현된객체를실행시에대입 a = getanimal(); a.makesound(); 구상클래스 12
오리의행동디자인 다른형식의객체에서도나는행동과꽥꽥거리는행동을재사용할수있음. 기존의행동클래스를수정하거나날아다니는행동을사용하는 Duck 클래스를전혀건드리지않고도새로운행동을추가할수있음. 상속단점제거, 재사용제고. 날수있는클래스에서는무조건 flybehavior 인터페이스를구현함. 날수있는클래스를새로만들떄는무조건 fly 메소드를구현함. 디자인원칙구현이아닌인터페이스에맞춰서프로그래밍한다.. 꽥꽥거리는것과관련된행동에대해서도마찬가지. 반드시구현해햐만하는 quack() 메소드가들어있는인터페이스가있음. 날개가달린오리들의나는동작을구현 날수없는오리를구현 꽥꽥거리는오리 삑삑거리는오리 아무소리도못내는오리 13
Duck 행동통합하기 생성자 인터페이스형식의인스턴스변수 인스턴스변수에는실행시에특정행동에대한레퍼런스가저장됨. 꽥꽥거리는행동을직접처리하는대신, quackbehavior 로참조되는객체에그행동을위임 행동변수는행동인터페이스형식으로선언됨. fly() 와 quack() 대신 14
인터페이스와행동구현클래스 행동인터페이스형식의레퍼런스변수 행동클래스에위임 이인터페이스는모든나는행동에대한클래스에서구현 실제로날수있는오리들의나는행동을구현한클래스 15
동적으로행동지정 Setter method 실행시세터메소드를호출하여행동을지정 생성자 생성될때나는행동은 FlyNoWay 로우는행동은 Quack 로지정 16
테스트클래스 / 드라이버 생성자 quackbehavior 및 flybehavior 는 Duck 클래스에서상속받은인스탄스변수 생성자 ModelDuck 이생성될때 flybehavior 는 FlyNoWay 인스탄스로생성 17
캡슐화된행동의큰그림 오리들은모두 Duck 을확장해서만들고, 꽥꽥소리를내는행동은 QuackBehavior 를, 나는행동은 FlyBehavior 를구현해서만듬. 각행동의집합을알고리즘군으로생각함. 이런행동 알고리즘 은바뀔수있음. 18
오리클래스는행동을상속받는대신, 올바른행동객체로구성된행동을부여받음. 디자인원칙상속보다는구성 (composition) 을활용한다.. A 는 B 이다 보다 A 에는 B 가있다 가나을수있음. 구성 (composition) 을이용하여시스템을만들면 유연성을크게향상시킴. 알고리즘군을별도의클래스집합으로캡슐화함. 구성요소로사용하는객체에서올바른행동인터페이스를구현하기만하면실행시에행동을바꿀수도있음. 19
Strategy Pattern 알고리즘군을정의하고각각을캡슐화하여교환해서사용할수있도록함. 스트레티지를활용하면알고리즘을사용하는클라이언트는독립적으로알고리즘을변경할수있음. 의도 다양한알고리즘이존재하면이들각각을하나의클래스로캡슐화하여알고리즘의대체가가능하도록함. 스트레티지패턴을이용하면클라이언트와독립적인다양한알고리즘으로변형할수있음. 알고리즘을바꾸더라도클라이언트는아무런변경을할필요가없음. 20
전문용어의위력 서로알고있는패턴용어는정말막강함. 패턴을이용하면간단한단어로많은것을얘기할수있음. 패턴수준에서이야기를하면 디자인 에더오랫동안집중할수있음. 전문용어를사용하면개발팀의능력을극대화할수있음. 전문용어는신참개발자들에게훌륭한자극제가됨. 21
디자인패턴사용방법 디자인패턴이바로코드로들어가는것은아님. 디자인패턴은우선머리속 ( 완전히익혀야 ) 에들어감. 새로디자인할때, 또는이전의코드가유연성이전혀없는스파게티코드라는것을알아내고새로코딩해야하는경우에패턴을적용가능 If you have only a hammer, whole world looks like a nail. 개발자의두뇌 여러가지패턴디자인패턴의적용으로새로만들어진, 향상된코드 22
디자인도구상자안에들어가야할도구들 객체지향의기초 추상화캡슐화다형성상속 객체지향의원칙바뀌는부분은캡슐화한다상속보다는구성을활용한다구현이아닌인터페이스에맞춰서프로그래밍한다.. 객체지향의패턴 Strategy Pattern 알고리즘군을정의하고 각각을캡슐화하여바꿔쓸수있게만듬.. 스트레티지패턴을이용하면알고리즘을활용하는클라이언트와독립적으로알고리즘을변경할수있음.. 23
핵심정리 객체지향기초지식만가지고는훌륭한객체지향디자이너가될수없음 훌륭한객체지향디자인이라면재사용성, 확장성, 관리의용이성을갖춰야함. 패턴은훌륭한객체지향디자인품질을갖추고있는시스템을만드는방법을제공해줌. 패턴은검증받은객체지향경험의산물임. 패턴이코드를바로제공해주는것은아닙니다. 디자인문제에대한일반적인해법을제공함. 특정애플리케이션에패턴을적용하는것은여러분이해야할일임. 패턴은발명되는것이아니라발견되는것임. 대부분의패턴과원칙은소프트웨어의변경문제와관련됨. 대부분의패턴은시스템의일부분을나머지부분과무관하게변경하는방법을제공함. 많은경우에시스템에서바뀌는부분을골라내서캡슐화시켜야함. 패턴은다른개발자들과의의사소통의가치를극대화시킬수있는전문용어역할을합니다. 24