SlideShare ist ein Scribd-Unternehmen logo
1 von 123
Design Patterns
Elements of Reusable Object-Oriented Software
1.Introduce
2.Creational Patterns
3.Structural Patterns
4.Behavioral Patterns
OVERVIEW
INTRODUCE
Chapter 1
Design Patterns
 Why are patterns important
“패턴이 있다”라고 하는 이야기는 반복되어 사용된다는 이야기
이고, 반복해서 적용할 수 있다는 이야기 입니다.
잘 설계된 패턴이 있다면, 이를 반복해 적용해서 코드와 디자인
을 재사용해서 개발 효율을 높일 수 있습니다.
패턴은 커뮤니케이션 도구로 사용되기도 합니다. 예를 들어 실
업무상에서 그 객체는 Singleton이 좋겠어요. Factory 구현이 필
요하네요. 라는 식으로 의사소통을 하는 경우가 많이 있습니다.
패턴이 가지는 구조가 추상화 되어 이름만으로 그 내용을 알 수
있기 때문에 효과적인 의사소통이 가능합니다. 반대로 패턴을 이
해하지 못하고 있으면 무슨 말을 하는지 알지 못합니다.
CREATIONAL PATTERNS
Chapter 2
Creational Patterns
 Abstract Factory
Definition
실제 클래스를 명시하지 않고도 관련성이 있거나 의존적인 객체
들을 생성하기 위한 인터페이스를 제공합니다.
Usage
Factory가 실제 생성할 객체를 결정합니다. 그런데 이 factory
는 실제 생성할 객체의 abstract pointer를 반환합니다.
이렇게 해서 클라이언트 코드와 실제 클래스 생성 코드를 분리
할 수 있습니다.
Also Known As
Kit
Creational Patterns
 Abstract Factory
Structure
Creational Patterns
 Abstract Factory
Example
CreationalAbstract factory.java
java.util.Calendar#getInstance()
java.util.Arrays#asList()
java.util.ResourceBundle#getBundle()
java.net.URL#openConnection()
java.sql.DriverManager#getConnection()
java.sql.Connection#createStatement()
java.sql.Statement#executeQuery()
java.text.NumberFormat#getInstance()
java.lang.management.ManagementFactory (all getXXX() methods)
java.nio.charset.Charset#forName()
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (Returns singleton
object per protocol)
Creational Patterns
 Abstract Factory
Where to use
• 객체가 생성되거나 구성, 표현되는 방식과 무관한 시스템을
만들고자 할 때
• 여러 모듈 중 하나를 선택해서 시스템을 설정해야 하고 한번
구성한 모듈을 다른 것으로 대체할 수 있을 때
• 관련된 모듈 객체들이 함께 사용되도록 설계되었고, 이 부분
에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
• 모듈에 대한 클래스 라이브러리를 제공하고, 그들의 구현이
아닌 인터페이스를 노출시키고 싶을 때
Creational Patterns
 Abstract Factory
Benefits
• 구현 클래스를 분리
• 팩토리 모듈의 대체가 쉬움
• 모듈 사이의 일관성을 증진시킴
Drawbacks/consequences
• 새로운 종류의 모듈을 사용하기는 어려움(Abstract Factory
를 상속받지 않은)
Creational Patterns
 Builder
Definition
복합(complex) 객체의 생성과 표현을 분리합니다. 이렇게 하여
같은 생성 프로세스로 다른 표현 객체를 만들 수 있습니다.
Creational Patterns
 Builder
Structure
Builder 객체를 생성을 위한 인터페이스
ConcreteBuilder 빌더를 구현한 클래스. 이것은 다른 객체(product)를 생성
할 수 있는 객체입니다. 객체(product) 생성에 생성한
parts를 assembling하여 객체를 생성합니다.
Director 디렉터 클래스는 객체 생성에 필요한 절차를 거치고 관리
할 책임을 집니다.
Product 디렉터가 빌더를 사용해 생성하는 최종 객체입니다.
Creational Patterns
 Builder
Example
CreationalBuilder.java
java.lang.StringBuilder#append() (unsynchronized)
java.lang.StringBuffer#append() (synchronized)
java.nio.ByteBuffer#put() (also on CharBuffer, ShortBuffer,
IntBuffer, LongBuffer, FloatBuffer and DoubleBuffer)
javax.swing.GroupLayout.Group#addComponent()
All implementations of java.lang.Appendable
Creational Patterns
 Builder
Where to use
• 복합 객체의 생성 알고리즘은 각 요소에 의존적이지 않아야
하고 각 부분을 어떻게 구성하더라도 상관이 없어야 사용할
수 있습니다.
• 생성절차에서 생성된 객체의 다른 표현을 허용해야만 합니다.
Creational Patterns
 Builder
Benefits
• 다양한 내부 표현을 가지는 객체를 생성할 수 있게 함
• 생성코드와 표현코드가 분리됨, 두 코드 모두 미치는 영향 없
기 쉽게 교체가 가능함.
• 생성 프로세스상에서 좀 더 세밀한 컨트롤이 가능하게 함
Creational Patterns
 Factory Method
Definition
객체 생성을 위한 인터페이스를 정의하지만, 어떤 클래스의 인
스턴스를 만들지 결정은 서브클래스가 담당합니다.
Usage
Factory는 다른 오브젝트를 생성하기 위한 객체입니다. 이것은
추상화된 생성자인데, 여러가지 형태로 구현되어 사용할 수 있
습니다.
Also Known As
Virtual Constructor
Creational Patterns
 Factory Method
Structure
Creational Patterns
 Factory Method
Example
CreationalFactory Method.java
java.lang.Object#toString() (overrideable in all subclasses)
java.lang.Class#newInstance()
java.lang.Integer#valueOf(String) (also on Boolean, Byte,
Character, Short, Long, Float and Double)
java.lang.Class#forName()
java.lang.reflect.Array#newInstance()
java.lang.reflect.Constructor#newInstance()
Creational Patterns
 Factory Method
Where to use
• 생성해야만 하는 객체의 클래스를 예측할 수 없을 때
• 객체 생성을 서브클래스가 담당하기 원할 때
• 어떤 클래스가 생성될지 아는 것을 localize 시키고 싶을때
Creational Patterns
 Factory Method
Benefits
• 클라이언트는 생성되는 서브클래스들을 알 필요가 없음.
• 팩토리는 객체의 생성을 캡슐화 함
Drawbacks/consequences
• Product 서브클래스의 객체 하나만 만들려고 해도 Creator
클래스를 서브클래싱을 해야 함
Creational Patterns
 Prototype
Definition
원시 인스턴스를 이용해서 생성하기 위한 객체의 종류를 명시하
고, 이 원형을 복사하여 새로운 객체를 생성
Creational Patterns
 Prototype
Structure
Creational Patterns
 Prototype
Example
CreationalPrototype.java
java.lang.Object#clone() (the class has to implement
java.lang.Cloneable)
Creational Patterns
 Prototype
Where to use
• 객체의 인스턴스화가 런타임에 구체화 될 때 예) 동적 로딩
• 생성물의 계층과 병렬적인 팩토리 계층의 클래스를 만드는
것을 피하고 싶을 때
• 클래스의 인스턴스들이 단지 몇 개의 상태의 조합에 불과할
때
• 클래스의 수를 최소화 하고 싶을때
• 클래스에 따라 동적으로 어플리케이션을 설정하고 싶을 때
Creational Patterns
 Prototype
Benefits
• 큰 클래스의 인스턴스를 만들때 속도가 빠름
• 클래스의 동적 로딩이 가능함
• 서브클래싱을 줄임
Drawbacks/consequences
• Prototype의 서브클래스들은 Clone 연산을 구현해야만 함
Creational Patterns
 Singleton
Definition
클래스가 오직 한 개의 인스턴스만을 가질 수 있도록 보장하고,
이에 대한 전역적인 접근점을 제공합니다.
Creational Patterns
 Singleton
Structure
Singleton
+static instance: Singleton
-Singleton()
+static getInstance(): Singleton
Creational Patterns
 Singleton
Example
CreationalSingleton.java
java.lang.Runtime#getRuntime()
java.awt.Desktop#getDesktop()
Creational Patterns
 Singleton
Where to use
• 클래스의 인스턴스가 단 하나이어야 할때, 그리고 잘 알려진
진입점으로 부터 접근 가능해야 할때
• 하나의 인스턴스가 서브클래싱 방법을 이용해 확장 가능해야
할때, 클라이언트는 코드 수정 없이 extended intance를 사
용할수 있어야 할때
Creational Patterns
 Singleton
Benefits
• 유일한 인스턴스로 접근 제어가 가능
• 네임스페이스를 줄임
• 연산과 표현의 개선이 가능함
• 인스턴스의 수를 조절할 수 있음
• 클래스 연산을 사용한 방법보다 유연함 (static의 경우
override 불가)
Drawbacks/consequences
• Singleton pattern의 오남용하게 되면, 실제로 유일한 인스턴
스가 필요하지 않은 경우에도 불필요한 제한을 가하게 됩니
다.
STRUCTUAL PATTERNS
Chapter 3
Structural Patterns
 Adapter
Definition
클래스의 인터페이스를 클라이언트가 요구하는 인터페이스로
변환합니다. Adapter는 인터페이스가 맞지 않아 동작하지 않는
클래스들을 함께 사용할 수 있도록 해줍니다.
Also Known As
Wrapper
Structural Patterns
 Adapter
Structure
Structural Patterns
 Adapter
Example
StructuralAdapter.java
java.io.InputStreamReader(InputStream) (returns a Reader)
java.io.OutputStreamWriter(OutputStream) (returns a Writer)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
and #unmarshal()
Structural Patterns
 Adapter
Where to use
• 기존에 사용하던 클래스를 사용하려고 하는데 필요한 인터페
이스와 맞지 않을 때
• 관련성이 없거나 예측하지 못했던 클래스에 맞게 동작시키기
위한 재 사용 가능한 클래스를 만들려고 할 때
• 클래스의 투명성을 증가시키고 싶을 때
Structural Patterns
 Adapter
Benefits
• 클래스 재 사용성이 높아짐
• 한 개의 객체만 사용
Drawbacks/consequences
• Java를 사용할 때 Target은 interface여야만 함
Structural Patterns
 Bridge
Definition
구현에서 추상적인 부분을 분리해서 이 두 가지가 독립성을 가
질 수 있게 합니다.
Also Known As
Handle/Body
Structural Patterns
 Bridge
Structure
Structural Patterns
 Bridge
Example
StructuralBridge.java
None comes to mind yet. A fictive example would be new
LinkedHashMap(LinkedHashSet<K>, List<V>) which returns
an unmodifiable linked map which doesn't clone the items,
but uses them. The java.util.Collections#newSetFromMap()
and singletonXXX() methods however comes close.
Structural Patterns
 Bridge
Where to use
• 구조/개념과 구현이 영구적으로 바인딩 되는 것을 피하고 싶
을 때
• 구조/개념과 구현 모두 상속 가능하게 하고 싶을 때
• 구조/개념을 구현한 구현의 변경이 클라이언트에 미치는 영
향이 없게 하려 할때
• 구현 내용을 클라이언트로 부터 완전히 숨기고 싶을때 (C++)
• 구현을 다수의 객체에게 공유하고자 하지만, 이 사실을 클라
이언트에게 숨겨야 할 때
Structural Patterns
 Bridge
Benefits
• 구현을 런타임에 선택하거나 교체할 수 있음
• 추상(구조/개념)과 구현을 각자 독립적으로 확장하거나 합성
할 수 있음
Drawbacks/consequences
• 간접 구현의 중복, 약간의 performance의 이슈가 생길 수 있
음
Structural Patterns
 Composite
Definition
부분-전체 계층을 나타내기 위해 트리 구조로 객체를 compose
합니다. Composite는 각각의 객체와 composition들을 같은 형
태로 처리할 수 있도록 합니다.
Structural Patterns
 Composite
Structure
Structural Patterns
 Composite
Example
StructuralComposite.java
java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
java.nio.ByteBuffer#put(ByteBuffer) (also on CharBuffer,
ShortBuffer, IntBuffer, LongBuffer, FloatBuffer and
DoubleBuffer)
java.awt.Container#add(Component) (practically all over
Swing thus)
Structural Patterns
 Composite
Where to use
• 객체들의 부분-전체 계층을 표현하고자 할 때
• 클라이언트에게 객체들의 composition과 각각의 객체 사이
의 차이점을 무시할 수 있게 하고 싶을 때
Structural Patterns
 Composite
Benefits
• primitive 객체와 composite 객체로 구성된 클래스 계층 구
조를 정의함
• 클라이언트 코드가 간단해짐
• 새로운 종류의 component를 추가하기가 쉬워짐
Drawbacks/consequences
• 지나치게 일반적인 설계가 될 수 있음(제약을 가하기 어려움)
Structural Patterns
 Decorator
Definition
객체에 동적으로 기능을 추가합니다. Decorator는 상속을 대체
하여 기능 확장을 할 수 있는 유연함을 제공합니다.
Also Known As
Wrapper
Structural Patterns
 Decorator
Structure
Structural Patterns
 Decorator
Example
StructuralDecorator.java
All subclasses of java.io.InputStream, OutputStream, Reader
and Writer have a constructor taking an instance of same
type.
Almost all implementations of java.util.List, Set and Map
have a constructor taking an instance of same type.
java.util.Collections, the checkedXXX(), synchronizedXXX()
and unmodifiableXXX() methods.
javax.servlet.http.HttpServletRequestWrapper and
HttpServletResponseWrapper
Structural Patterns
 Decorator
Where to use
• 각각의 객체에 다른 객체에 영향을 주지 않으면서 동적으로
투명하게 기능을 추가하기 위해
• 제거될 수 있는 기능
• 상속에 의한 확장이 불합리한 방법일 때
Structural Patterns
 Decorator
Benefits
• 단일(다중) 상속보다 유연함
• 상위 계층의 클래스에 feature가 몰리는 것을 방지
Drawbacks/consequences
• 서로 연결된 작고 많은 수의 객체가 생기기 때문에, 전체 시
스템을 잘 이해하고 있지 않으면 커스트 마이징하거나 디버
깅이 어려울 수 있음.
• Decorator의 chain이 긴 경우 performance overhead가 발
생할 수 있음.
Structural Patterns
 Facade
Definition
서브시스템의 인터페이스 셋이 되는 통합된 인터페이스 환경을
제공합니다. Facade는 서브시스템의 이용을 쉽게 하는 고수준
의 인터페이스를 정의합니다.
Structural Patterns
 Facade
Structure
Structural Patterns
 Facade
Example
StructuralFacade.java
javax.faces.context.FacesContext, it internally uses among
others the abstract/interface types LifeCycle, ViewHandler,
NavigationHandler and many more without that the
enduser has to worry about it (which are however
overrideable by injection).
javax.faces.context.ExternalContext, which internally uses
ServletContext, HttpSession, HttpServletRequest,
HttpServletResponse, etc.
Structural Patterns
 Facade
Where to use
• 복잡한 서브시스템의 간단한 인터페이스를 제공하고 싶을 때
• 클라이언트와 구현된 코드 사이에 의존 관계가 많을 때
• 서브시스템을 레이어로 나누고 싶을 때
Structural Patterns
 Facade
Benefits
• 클라이언트에게 서브시스템 구성요소를 숨김
• 클라이언트가 관여하는 객체 수가 줄어들고 서브시스템 사용
을 쉽게 함
• 서브시스템과 클라이언트간에 커플링을 약하게 함
Drawbacks/consequences
• 어플리케이션이 서브시스템 클래스를 사용하려고 할 때 이를
막지는 못함. 그러므로 쉬운 사용방법과 일반적인 방법 중에
하나를 골라서 사용할 수 있음
Structural Patterns
 Flyweight
Definition
공유를 통해 많은 수의 작은 객체들을 효과적 지원합니다.
Structural Patterns
 Flyweight
Structure
Structural Patterns
 Flyweight
Example
StructuralFlyweight.java
java.lang.Integer#valueOf(int) (also on Boolean, Byte,
Character, Short, Long, Float and Double)
Structural Patterns
 Flyweight
Where to use
• 어플리케이션이 많은 수의 객체를 사용할 때
• 객체의 양이 많아 저장 비용이 클 때
• 대부분 객체의 상태를 객체 외적인 것으로 만들 수 있을 때
• 많은 객체 그룹이 객체 외적인 요소가 제거된 상대적으로 작
은 수의 공유 객체로 교체가 가능할 때.
• 어플리케이션이 객체의 identity에 의존적이지 않을 때.
Structural Patterns
 Flyweight
Benefits
• 공간 절약(flyweight이 공유된 만큼 더 증가)
• 객체 생성을 줄임
Drawbacks/consequences
• Flyweight은 런타임에 연산비용이 증가할 수 있음(공간 절약
된 부분에서 절충 될 수 있음)
Structural Patterns
 Proxy
Definition
다른 객체의 접근 제어를 위한 Surrogate나 Placeholder를 제
공
Also Known As
Surrogate
Structural Patterns
 Proxy
Structure
Structural Patterns
 Proxy
Example
StructuralProxy.java
java.lang.reflect.Proxy
java.rmi.*, the whole API actually.
Structural Patterns
 Proxy
Where to use
• remote proxy는 다른 주소 공간을 위한 local
representative를 제공
• virtual proxy는 요구에 따라 생성되는 고비용 객체를 생성
• protection proxy는 오리지널 객체의 접근을 제어(권한)
• smart reference는 단순 포인터를 대체하는 것으로 객체에
대한 접근이 이루어졌을 때 추가적인 동작을 함
Structural Patterns
 Proxy
Benefits
• remote proxy는 객체가 다른 주소공간에 존재한다는 사실을
숨길 수 있음
• virtual proxy는 퍼포먼스를 최적화 시킬 수 있음(필요할 때
만 객체 생성을 한다는 방법 등)
• protection proxy와 smart reference는 객체에 대한 접근이
일어났을 때 추가적인 보호 작업을 할 수 있음.
Drawbacks/consequences
• 객체에 대한 추가적인 추상 레벨을 제공(어떤 객체에 직접 접
근하는것과 프록시를 통해 접근하는 것에는 차이가 있을 수
있으며 이것은 제작자가 의도하거나 의도하지 않은 것 일 수
있음)
BEHAVIORAL PATTERNS
Chapter 4
Behavioral Patterns
 Chain of Responsibility
Definition
한 개 이상의 객체에게 request를 핸들링 할 수 있게 기회를 제
공함으로서 request sender와 receiver간의 커플링을 피합니다.
Behavioral Patterns
 Chain of Responsibility
Structure
Behavioral Patterns
 Chain of Responsibility
Example
BehavioralChain of Responsibility.java
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
Behavioral Patterns
 Chain of Responsibility
Where to use
• 한 개 이상의 객체가 요청을 핸들링 하고 핸들러는 우선순위
를 모를때. 핸들러는 자동으로 지정해 주어야만 함
• 예상 receiver가 누구인지 명시하지 않고, 몇몇 객체 중 하나
에게 요청을 발행하고 싶을 때
• 요청을 처리할 객체 셋이 동적으로 정해져야 할 때
Behavioral Patterns
 Chain of Responsibility
Benefits
• 커플링을 줄임
• 핸들러 할당의 유연성을 높임
Drawbacks/consequences
• 수신이 보장되지 않음
Behavioral Patterns
 Command
Definition
요청을 객체로 캡슐화 함. 그렇게 함으로서 다른 요청들을 매개
변수화 시킬 수 있게 하고, 큐나 로그를 사용할 수 있고, 되돌리
기 연산을 지원할 수 있음.
Also Known As
Action, Transaction
Behavioral Patterns
 Command
Structure
Behavioral Patterns
 Command
Example
BehavioralCommand.java
All implementations of java.lang.Runnable
All implementations of javax.swing.Action
Behavioral Patterns
 Command
Where to use
• action 수행을 위해 객체를 매개변수화 할때
• 각기 다른 시간의 세부화된, 큐, 실행 요청
• 되돌리기(undo) 지원
• system crash시 다시 적용시키기 위한 변경사항 로깅 지원
• 기본 연산으로 만들어진 상위레벨 연산 체계의 구조를 만들
고 싶을때. 이러한 구조중 일반적인 것으로 transaction과 같
은게 있음.
Behavioral Patterns
 Command
Benefits
• 요청을 저장할 수 있다.
• 관련된 특정 action이나 event를 모을 수 있다.
• 다른 action을 발행하는 것이 가능하다.
• command 객체는 multiple command를 포함할 수 있다.
• 되돌리기 연산을 지원할 수 있다.
Drawbacks/consequences
• action을 담기 위한 작은 클래스들이 많이 생긴다는 단점이
있으나 큰 문제는 안 된다.
Behavioral Patterns
 Interpreter
Definition
주어진 언어에 대해 그 언어로 된 문장을 인터프리터가 해석할
표현식을 정의합니다.
Behavioral Patterns
 Interpreter
Structure
Behavioral Patterns
 Interpreter
Example
BehavioralInterpreter.java
java.util.Pattern
java.text.Normalizer
All subclasses of java.text.Format
All subclasses of javax.el.ELResolver
Behavioral Patterns
 Interpreter
Where to use
• 문법이 단순할 때
• 효율성이 중요 고려 사항이 아닐 때
Behavioral Patterns
 Interpreter
Benefits
• 문법의 변경, 확장이 용이
• 문법을 구현하는 것이 쉬움
• 새로운 표현식 해석 방법 추가가 용이
Drawbacks/consequences
• 복잡한 문법을 유지하는 것은 어려움
Behavioral Patterns
 Iterator
Definition
하단 구현부를 노출하지 않고 집합 객체의 element에 순차적으
로 접근할 수 있는 방법을 제공
Also Known As
Cursor
Behavioral Patterns
 Iterator
Structure
Behavioral Patterns
 Iterator
Example
All implementations of java.util.Iterator (thus among others
also java.util.Scanner!).
All implementations of java.util.Enumeration
Behavioral Patterns
 Iterator
Where to use
• 내부 구현을 노출하지 않고 집합 객체의 컨텐츠에 접근하려
할 때
• 집합객체의 다양한 traversal 법을 제공 하려 할 때
• 여러가지 집합 구조에 동일한 인터페이스를 제공하려 할 때
Behavioral Patterns
 Iterator
Benefits
• 같은 iterator가 다른 aggregate에 사용될 수 있음
• 다양한 형태의 traversal 방법을 지원
• Aggregate interface를 단순화 시킴
• iteration이 일어나는 내부구조를 캡슐화
Drawbacks/consequences
• Thread safe 하지 않을 수 있음. (Memento를 이용하는 등으
로 해결 가능)
Behavioral Patterns
 Mediator
Definition
객체 셋(set)이 어떻게 상호작용하는지를 캡슐화하는 객체를 정
의합니다. Mediator는 각 객체가 명시적으로 레퍼런싱 하지 못
하도록 하여 커플링을 약화시키고 그들의 상호작용이 독립적으
로 일어날 수 있게 해줍니다.
Behavioral Patterns
 Mediator
Structure
Behavioral Patterns
 Mediator
Example
BehavioralMediator.java
java.util.Timer (all scheduleXXX() methods)
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService (the invokeXXX() and
submit() methods)
java.util.concurrent.ScheduledExecutorService (all
scheduleXXX() methods)
java.lang.reflect.Method#invoke()
Behavioral Patterns
 Mediator
Where to use
• 객체 셋(set)이 잘 정의된 방법으로 커뮤니케이트 하나 복잡
한 방법을 사용한다.
• 객체간 레퍼런싱 한게 많고, 커뮤니케이트가 많아서 객체 재
사용이 어렵다.
• 몇몇 클래스 간의 분산된 행동들이 서브클래싱을 많이 하지
않고 커스트마이징 될 수 있어야 할 때
Behavioral Patterns
 Mediator
Benefits
• 서브클래싱을 제한
• 동료간 커플링을 제거
• 객체 프로토콜을 단순화
• 객체의 협력 방법을 추상화
• 컨트롤을 집중시킴
Drawbacks/consequences
• 퍼포먼스 이슈를 가질 수 있음, mediator가 병목지점이 될 수
있음
Behavioral Patterns
 Memento
Definition
캡슐화를 침범하지 않고, 객체의 내부 상태를 캡쳐해서 다음에
재사용할 수 있게 함.
Also Known As
Token
Behavioral Patterns
 Memento
Structure
Behavioral Patterns
 Memento
Example
BehavioralMemento.java
java.util.Date (the setter methods do that, Date is internally
represented by a long value)
All implementations of java.io.Serializable
All implementations of javax.faces.component.StateHolder
Behavioral Patterns
 Memento
Where to use
• 객체 상태의 스냅샷을 저장하고 복원해야만 할 때
• 인터페이스를 통해 직접 상태를 얻게 되면 내부 구현을 노출
시켜 객체의 캡슐화를 위배하게 될때
Behavioral Patterns
 Memento
Benefits
• 캡슐화된 상태를 유지
• 원본 객체가 단순해짐
• 모듈 사이의 일관성을 증진시킴
Drawbacks/consequences
• memento 사용이 비쌀 수 있음
• 몇몇 언어에서 구현이 어려움
Behavioral Patterns
 Observer
Definition
일대 다의 의존관계를 객체간에 설정해 두어 한 오브젝트의 상
태가 바뀌면 의존성을 가진 모든 객체가 상태를 자동으로 업데
이트 할 수 있게 함
Also Known As
Dependents, Publish-Subscribe
Behavioral Patterns
 Observer
Structure
Behavioral Patterns
 Observer
Example
BehavioralObserver.java
java.util.Observer/java.util.Observable (rarely used in real
world though)
All implementations of java.util.EventListener (practically all
over Swing thus)
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
Behavioral Patterns
 Observer
Where to use
• 한 객체가 정보를 발행하길 원하고 다른 객체가 이 정보를 받
아야 할 필요가 있을 때
Behavioral Patterns
 Observer
Benefits
• publish와 subscriber 간 결합상태를 약하게 만듬 publisher
는 어떤, 얼마나 많은 subscriber가 존재하는지 알 필요가 없
음
Drawbacks/consequences
• 모든 subscriber에게 불필요한 정보를 전달해서 오버헤드를
야기 할 수 있음
Behavioral Patterns
 State
Definition
내부 state가 변경되었을 때 객체가 자신의 행동을 변화시킬 수
있도록 함. 객체는 자신의 클래스를 변경하는 것 같이 보임.
Also Known As
Objects for States
Behavioral Patterns
 State
Structure
Behavioral Patterns
 State
Example
BehavioralState.java
All implementations of java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute() (controlled by
FacesServlet, the behaviour is dependent on current phase
(state) of JSF lifecycle)
Behavioral Patterns
 State
Where to use
• 객체의 행동이 state에 의존적이고, state에 따라 런타임에
행동이 변경되어야만 할 때
• 연산들이 객체의 state에 의존하는 크고 많은 조건을 가질 때
Behavioral Patterns
 State
Benefits
• 각각의 state를 클래스로 정의했을 때보다 코드가 깔끔하다
• 클래스가 상수가 아닌 state를 나타내도록 사용한다.
Drawbacks/consequences
• 작은 크기의 클래스 객체를 많이 만든다. 하지만, 프로그램이
프로세스 상에서 간결하고 명확해진다.
Behavioral Patterns
 Strategy
Definition
알고리즘들의 군을 정의하고, 각각을 캡슐화 시켜서, 상호 교환
할 수 있도록 만든다. Strategy는 알고리즘을 그것을 사용하는
클라이언트로 부터 매우 독립적으로 만든다.
Also Known As
Policy
Behavioral Patterns
 Strategy
Structure
Behavioral Patterns
 Strategy
Example
BehavioralStrategy.java
java.util.Comparator#compare(), executed by among others
Collections#sort().
javax.servlet.http.HttpServlet, the service() and all doXXX()
methods take HttpServletRequest and HttpServletResponse
and the implementor has to process them (and not to get
hold of them as instance variables!).
javax.servlet.Filter#doFilter()
Behavioral Patterns
 Strategy
Where to use
• 많은 관련 클래스들이 그들의 행동만 다를 때
• 한 알고리즘의 다양한 형태가 필요할 때
• 알고리즘이 클라이언트가 모르는 데이터를 사용할때
• 한 클래스가 많은 행동을 정의하고 그들의 연산은 많은 조건
문으로 표현될때
Behavioral Patterns
 Strategy
Benefits
• 많은 조건문을 줄임
• 복잡하고 알고리즘 의존적인 데이터를 숨김
• 서브클래싱의 대안
Drawbacks/consequences
• 클라이언트는 strategy들의 차이점을 알고 있어야 함
• 객체 수가 증가
Behavioral Patterns
 Template Method
Definition
객체의 연산에는 알고리즘의 뼈대만 정의하고, 몇몇 단계의 구
현은 서브클래스로 미룹니다. Template Method는 알고리즘 구
조의 변경 없이 서브클래스에게 이러한 몇몇 단계의 알고리즘의
부분들을 재정의 할 수 있게 합니다.
Behavioral Patterns
 Template Method
Structure
Behavioral Patterns
 Template Method
Example
BehavioralTemplate Method.java
All non-abstract methods of java.io.InputStream,
java.io.OutputStream, java.io.Reader and java.io.Writer.
All non-abstract methods of java.util.AbstractList,
java.util.AbstractSet and java.util.AbstractMap.
javax.servlet.http.HttpServlet, all the doXXX() methods by
default sends a HTTP 405 "Method Not Allowed" error to
the response. You're free to implement none or any of them.
Behavioral Patterns
 Template Method
Where to use
• 알고리즘 중 변경되지 않는 부분의 구현을 하고 변경될 수 있
는 부분은 서브클래스가 구현하도록 할 때
• 코드 중복을 피하기 위해 버스클래스 간의 공통 행동을 공통
클래스안에 모아두고 싶을 때
• 서브클래스 확장을 컨트롤 하기 위해
Behavioral Patterns
 Template Method
Benefits
• 코드 재사용
• 코드 중복 줄임
Drawbacks/consequences
• 연산이 오버라이드가 가능한지 꼭 해야 하는지 정하는 것이
중요
Behavioral Patterns
 Visitor
Definition
객체 구조의 element에게 수행될 연산을 표현. Visitor는 이것
이 수행될 element 클래스의 변경 없이 새로운 연산을 정의할
수 있게 해줌.
Behavioral Patterns
 Visitor
Structure
Behavioral Patterns
 Visitor
Example
BehavioralVisitor.java
javax.lang.model.element.AnnotationValue and
AnnotationValueVisitor
javax.lang.model.element.Element and ElementVisitor
javax.lang.model.type.TypeMirror and TypeVisitor
Behavioral Patterns
 Visitor
Where to use
• 객체 구조가 다른 인터페이스를 가진 많은 클래스 객체를 포
함하고 있으며 실제(인터페이스가 구현된) 클래스에 맞게 이
러한 객체가 연산을 수행할 수 있게 하고 싶을 때.
• 객체 구조 내의 객체에게 다른 것과 구별되고 관련성이 없는
많은 연산이 수행될 필요가 있고, 이러한 연산들에 의해 그들
의 클래스가 오염되는 것을 피하고 싶을 때
• 객체 구조를 정의하는 클래스들은 변경이 적지만 가끔 새로
운 연산을 정의하고 싶을 때
Behavioral Patterns
 Visitor
Benefits
• 새로운 연산을 추가하기가 쉽다.
• 관련된 연산을 모으고, 관련 없는 연산을 분리시킴
• element를 클래스 계층에 따라 접근
• state를 누적시킬 수 있음
Drawbacks/consequences
• 새로운 종류의 element class를 추가시키기 어렵다.
• 캡슐화를 깰 수 있음
Design Patterns
 Quiz
아래 문제에서 플랫폼은 동일하다고 가정합니다. 그 외 필요한 가정은 스스로 하면 됩니다.
UML을 사용하는 경우 파일은 이미지 파일로 저장해서 주십시오. (UML을 사용할 의무는 없습니다.)
1. 오디오 플레이 라이브러리를 만들려고 합니다.
지원하는 파일 형식은 런타임에 추가, 제거 될 수 있고 별도 플러그인으로 존재합니다.
편의상 해당 플러그인은 파일 오픈, 파일 형식 디텍팅과 재생, 정지, Seek의 기능을 제공한다고 가정
합니다.
파일 형식을 디텍팅하게 되면, 음악가 정보, 제목, 섬네일을 추출해 줍니다.
플러그인은 여러 업체에서 공급하기 때문에 인터페이스가 다를 수 있다고 가정합니다.
라이브러리를 디자인하고, 어떻게 코딩할 것인지 간단히 설명하십시오.
이 라이브러리는 플러그인과 마찬가지로 파일 오픈, 파일 메타데이터, 재생, 정지, seek기능을 제공
해야 합니다.
2. 위에서 만든 플레이어 라이브러리를 가지고, 태블릿과 핸드폰에서 사용할 UI 어플을 만들려고 합
니다.
핸드폰과 태블릿 화면크기가 다른 관계로 다른 화면 구성을 가지고 있다고 가정합니다.
플레이어 라이브러리는 교육대상자 여러명이 만든것을 사용하기 때문에, 인터페이스가 같지 않을
수 있습니다.

Weitere ähnliche Inhalte

Was ist angesagt?

목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해Yong Hoon Kim
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴Jaeho Seok
 
분석과 설계
분석과 설계분석과 설계
분석과 설계Haeil Yi
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swiftNAVER D2
 
영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA경원 이
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어NAVER D2
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정Javajigi Jaesung
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012Daum DNA
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프Younghan Kim
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Younghan Kim
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담Javajigi Jaesung
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기NAVER D2
 
Patterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksPatterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksSunuk Park
 

Was ist angesagt? (19)

목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swift
 
영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
 
LLVM ARC
LLVM ARCLLVM ARC
LLVM ARC
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조
 
Java class
Java classJava class
Java class
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
 
Patterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksPatterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworks
 

Andere mochten auch

동영상입문
동영상입문동영상입문
동영상입문Sukjin Yun
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton patternYoonJong Choi
 
IoC and DI Pattern
IoC and DI PatternIoC and DI Pattern
IoC and DI PatternSangwon Ko
 
Servlet design pattern
Servlet design patternServlet design pattern
Servlet design patternSukjin Yun
 
프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기Sangwon Ko
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet ArchitectureJU Chae
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴Sungchul Park
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기
실용주의 디자인패턴   2 인터페이스로 프로그래밍하기실용주의 디자인패턴   2 인터페이스로 프로그래밍하기
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기Cosmos Shin
 

Andere mochten auch (11)

동영상입문
동영상입문동영상입문
동영상입문
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton pattern
 
IoC and DI Pattern
IoC and DI PatternIoC and DI Pattern
IoC and DI Pattern
 
B Fn As
B Fn AsB Fn As
B Fn As
 
Heartbeat
HeartbeatHeartbeat
Heartbeat
 
Servlet design pattern
Servlet design patternServlet design pattern
Servlet design pattern
 
프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet Architecture
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기
실용주의 디자인패턴   2 인터페이스로 프로그래밍하기실용주의 디자인패턴   2 인터페이스로 프로그래밍하기
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기
 

Ähnlich wie Design patterns

[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계AnselmKim
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1정환 임
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2Minseok Jang
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 uEngine Solutions
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3Daniel Lim
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 pptInjae Lee
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여Jin wook
 
결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점JavaCommunity.Org
 

Ähnlich wie Design patterns (20)

[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
EC 789
EC 789EC 789
EC 789
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
데모 발표
데모 발표데모 발표
데모 발표
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 
7 8 1
7 8 17 8 1
7 8 1
 
결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점
 

Mehr von Joshua Yoon

Mehr von Joshua Yoon (6)

Data access
Data accessData access
Data access
 
AOP
AOPAOP
AOP
 
Database design
Database designDatabase design
Database design
 
HTTP Basic
HTTP BasicHTTP Basic
HTTP Basic
 
Javascript
JavascriptJavascript
Javascript
 
기업문화
기업문화기업문화
기업문화
 

Design patterns

  • 1. Design Patterns Elements of Reusable Object-Oriented Software
  • 4. Design Patterns  Why are patterns important “패턴이 있다”라고 하는 이야기는 반복되어 사용된다는 이야기 이고, 반복해서 적용할 수 있다는 이야기 입니다. 잘 설계된 패턴이 있다면, 이를 반복해 적용해서 코드와 디자인 을 재사용해서 개발 효율을 높일 수 있습니다. 패턴은 커뮤니케이션 도구로 사용되기도 합니다. 예를 들어 실 업무상에서 그 객체는 Singleton이 좋겠어요. Factory 구현이 필 요하네요. 라는 식으로 의사소통을 하는 경우가 많이 있습니다. 패턴이 가지는 구조가 추상화 되어 이름만으로 그 내용을 알 수 있기 때문에 효과적인 의사소통이 가능합니다. 반대로 패턴을 이 해하지 못하고 있으면 무슨 말을 하는지 알지 못합니다.
  • 6. Creational Patterns  Abstract Factory Definition 실제 클래스를 명시하지 않고도 관련성이 있거나 의존적인 객체 들을 생성하기 위한 인터페이스를 제공합니다. Usage Factory가 실제 생성할 객체를 결정합니다. 그런데 이 factory 는 실제 생성할 객체의 abstract pointer를 반환합니다. 이렇게 해서 클라이언트 코드와 실제 클래스 생성 코드를 분리 할 수 있습니다. Also Known As Kit
  • 8. Creational Patterns  Abstract Factory Example CreationalAbstract factory.java java.util.Calendar#getInstance() java.util.Arrays#asList() java.util.ResourceBundle#getBundle() java.net.URL#openConnection() java.sql.DriverManager#getConnection() java.sql.Connection#createStatement() java.sql.Statement#executeQuery() java.text.NumberFormat#getInstance() java.lang.management.ManagementFactory (all getXXX() methods) java.nio.charset.Charset#forName() javax.xml.parsers.DocumentBuilderFactory#newInstance() javax.xml.transform.TransformerFactory#newInstance() javax.xml.xpath.XPathFactory#newInstance() java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (Returns singleton object per protocol)
  • 9. Creational Patterns  Abstract Factory Where to use • 객체가 생성되거나 구성, 표현되는 방식과 무관한 시스템을 만들고자 할 때 • 여러 모듈 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 모듈을 다른 것으로 대체할 수 있을 때 • 관련된 모듈 객체들이 함께 사용되도록 설계되었고, 이 부분 에 대한 제약이 외부에도 지켜지도록 하고 싶을 때 • 모듈에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때
  • 10. Creational Patterns  Abstract Factory Benefits • 구현 클래스를 분리 • 팩토리 모듈의 대체가 쉬움 • 모듈 사이의 일관성을 증진시킴 Drawbacks/consequences • 새로운 종류의 모듈을 사용하기는 어려움(Abstract Factory 를 상속받지 않은)
  • 11. Creational Patterns  Builder Definition 복합(complex) 객체의 생성과 표현을 분리합니다. 이렇게 하여 같은 생성 프로세스로 다른 표현 객체를 만들 수 있습니다.
  • 12. Creational Patterns  Builder Structure Builder 객체를 생성을 위한 인터페이스 ConcreteBuilder 빌더를 구현한 클래스. 이것은 다른 객체(product)를 생성 할 수 있는 객체입니다. 객체(product) 생성에 생성한 parts를 assembling하여 객체를 생성합니다. Director 디렉터 클래스는 객체 생성에 필요한 절차를 거치고 관리 할 책임을 집니다. Product 디렉터가 빌더를 사용해 생성하는 최종 객체입니다.
  • 13. Creational Patterns  Builder Example CreationalBuilder.java java.lang.StringBuilder#append() (unsynchronized) java.lang.StringBuffer#append() (synchronized) java.nio.ByteBuffer#put() (also on CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer and DoubleBuffer) javax.swing.GroupLayout.Group#addComponent() All implementations of java.lang.Appendable
  • 14. Creational Patterns  Builder Where to use • 복합 객체의 생성 알고리즘은 각 요소에 의존적이지 않아야 하고 각 부분을 어떻게 구성하더라도 상관이 없어야 사용할 수 있습니다. • 생성절차에서 생성된 객체의 다른 표현을 허용해야만 합니다.
  • 15. Creational Patterns  Builder Benefits • 다양한 내부 표현을 가지는 객체를 생성할 수 있게 함 • 생성코드와 표현코드가 분리됨, 두 코드 모두 미치는 영향 없 기 쉽게 교체가 가능함. • 생성 프로세스상에서 좀 더 세밀한 컨트롤이 가능하게 함
  • 16. Creational Patterns  Factory Method Definition 객체 생성을 위한 인터페이스를 정의하지만, 어떤 클래스의 인 스턴스를 만들지 결정은 서브클래스가 담당합니다. Usage Factory는 다른 오브젝트를 생성하기 위한 객체입니다. 이것은 추상화된 생성자인데, 여러가지 형태로 구현되어 사용할 수 있 습니다. Also Known As Virtual Constructor
  • 18. Creational Patterns  Factory Method Example CreationalFactory Method.java java.lang.Object#toString() (overrideable in all subclasses) java.lang.Class#newInstance() java.lang.Integer#valueOf(String) (also on Boolean, Byte, Character, Short, Long, Float and Double) java.lang.Class#forName() java.lang.reflect.Array#newInstance() java.lang.reflect.Constructor#newInstance()
  • 19. Creational Patterns  Factory Method Where to use • 생성해야만 하는 객체의 클래스를 예측할 수 없을 때 • 객체 생성을 서브클래스가 담당하기 원할 때 • 어떤 클래스가 생성될지 아는 것을 localize 시키고 싶을때
  • 20. Creational Patterns  Factory Method Benefits • 클라이언트는 생성되는 서브클래스들을 알 필요가 없음. • 팩토리는 객체의 생성을 캡슐화 함 Drawbacks/consequences • Product 서브클래스의 객체 하나만 만들려고 해도 Creator 클래스를 서브클래싱을 해야 함
  • 21. Creational Patterns  Prototype Definition 원시 인스턴스를 이용해서 생성하기 위한 객체의 종류를 명시하 고, 이 원형을 복사하여 새로운 객체를 생성
  • 24. Creational Patterns  Prototype Where to use • 객체의 인스턴스화가 런타임에 구체화 될 때 예) 동적 로딩 • 생성물의 계층과 병렬적인 팩토리 계층의 클래스를 만드는 것을 피하고 싶을 때 • 클래스의 인스턴스들이 단지 몇 개의 상태의 조합에 불과할 때 • 클래스의 수를 최소화 하고 싶을때 • 클래스에 따라 동적으로 어플리케이션을 설정하고 싶을 때
  • 25. Creational Patterns  Prototype Benefits • 큰 클래스의 인스턴스를 만들때 속도가 빠름 • 클래스의 동적 로딩이 가능함 • 서브클래싱을 줄임 Drawbacks/consequences • Prototype의 서브클래스들은 Clone 연산을 구현해야만 함
  • 26. Creational Patterns  Singleton Definition 클래스가 오직 한 개의 인스턴스만을 가질 수 있도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다.
  • 27. Creational Patterns  Singleton Structure Singleton +static instance: Singleton -Singleton() +static getInstance(): Singleton
  • 29. Creational Patterns  Singleton Where to use • 클래스의 인스턴스가 단 하나이어야 할때, 그리고 잘 알려진 진입점으로 부터 접근 가능해야 할때 • 하나의 인스턴스가 서브클래싱 방법을 이용해 확장 가능해야 할때, 클라이언트는 코드 수정 없이 extended intance를 사 용할수 있어야 할때
  • 30. Creational Patterns  Singleton Benefits • 유일한 인스턴스로 접근 제어가 가능 • 네임스페이스를 줄임 • 연산과 표현의 개선이 가능함 • 인스턴스의 수를 조절할 수 있음 • 클래스 연산을 사용한 방법보다 유연함 (static의 경우 override 불가) Drawbacks/consequences • Singleton pattern의 오남용하게 되면, 실제로 유일한 인스턴 스가 필요하지 않은 경우에도 불필요한 제한을 가하게 됩니 다.
  • 32. Structural Patterns  Adapter Definition 클래스의 인터페이스를 클라이언트가 요구하는 인터페이스로 변환합니다. Adapter는 인터페이스가 맞지 않아 동작하지 않는 클래스들을 함께 사용할 수 있도록 해줍니다. Also Known As Wrapper
  • 34. Structural Patterns  Adapter Example StructuralAdapter.java java.io.InputStreamReader(InputStream) (returns a Reader) java.io.OutputStreamWriter(OutputStream) (returns a Writer) javax.xml.bind.annotation.adapters.XmlAdapter#marshal() and #unmarshal()
  • 35. Structural Patterns  Adapter Where to use • 기존에 사용하던 클래스를 사용하려고 하는데 필요한 인터페 이스와 맞지 않을 때 • 관련성이 없거나 예측하지 못했던 클래스에 맞게 동작시키기 위한 재 사용 가능한 클래스를 만들려고 할 때 • 클래스의 투명성을 증가시키고 싶을 때
  • 36. Structural Patterns  Adapter Benefits • 클래스 재 사용성이 높아짐 • 한 개의 객체만 사용 Drawbacks/consequences • Java를 사용할 때 Target은 interface여야만 함
  • 37. Structural Patterns  Bridge Definition 구현에서 추상적인 부분을 분리해서 이 두 가지가 독립성을 가 질 수 있게 합니다. Also Known As Handle/Body
  • 39. Structural Patterns  Bridge Example StructuralBridge.java None comes to mind yet. A fictive example would be new LinkedHashMap(LinkedHashSet<K>, List<V>) which returns an unmodifiable linked map which doesn't clone the items, but uses them. The java.util.Collections#newSetFromMap() and singletonXXX() methods however comes close.
  • 40. Structural Patterns  Bridge Where to use • 구조/개념과 구현이 영구적으로 바인딩 되는 것을 피하고 싶 을 때 • 구조/개념과 구현 모두 상속 가능하게 하고 싶을 때 • 구조/개념을 구현한 구현의 변경이 클라이언트에 미치는 영 향이 없게 하려 할때 • 구현 내용을 클라이언트로 부터 완전히 숨기고 싶을때 (C++) • 구현을 다수의 객체에게 공유하고자 하지만, 이 사실을 클라 이언트에게 숨겨야 할 때
  • 41. Structural Patterns  Bridge Benefits • 구현을 런타임에 선택하거나 교체할 수 있음 • 추상(구조/개념)과 구현을 각자 독립적으로 확장하거나 합성 할 수 있음 Drawbacks/consequences • 간접 구현의 중복, 약간의 performance의 이슈가 생길 수 있 음
  • 42. Structural Patterns  Composite Definition 부분-전체 계층을 나타내기 위해 트리 구조로 객체를 compose 합니다. Composite는 각각의 객체와 composition들을 같은 형 태로 처리할 수 있도록 합니다.
  • 44. Structural Patterns  Composite Example StructuralComposite.java java.util.Map#putAll(Map) java.util.List#addAll(Collection) java.util.Set#addAll(Collection) java.nio.ByteBuffer#put(ByteBuffer) (also on CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer and DoubleBuffer) java.awt.Container#add(Component) (practically all over Swing thus)
  • 45. Structural Patterns  Composite Where to use • 객체들의 부분-전체 계층을 표현하고자 할 때 • 클라이언트에게 객체들의 composition과 각각의 객체 사이 의 차이점을 무시할 수 있게 하고 싶을 때
  • 46. Structural Patterns  Composite Benefits • primitive 객체와 composite 객체로 구성된 클래스 계층 구 조를 정의함 • 클라이언트 코드가 간단해짐 • 새로운 종류의 component를 추가하기가 쉬워짐 Drawbacks/consequences • 지나치게 일반적인 설계가 될 수 있음(제약을 가하기 어려움)
  • 47. Structural Patterns  Decorator Definition 객체에 동적으로 기능을 추가합니다. Decorator는 상속을 대체 하여 기능 확장을 할 수 있는 유연함을 제공합니다. Also Known As Wrapper
  • 49. Structural Patterns  Decorator Example StructuralDecorator.java All subclasses of java.io.InputStream, OutputStream, Reader and Writer have a constructor taking an instance of same type. Almost all implementations of java.util.List, Set and Map have a constructor taking an instance of same type. java.util.Collections, the checkedXXX(), synchronizedXXX() and unmodifiableXXX() methods. javax.servlet.http.HttpServletRequestWrapper and HttpServletResponseWrapper
  • 50. Structural Patterns  Decorator Where to use • 각각의 객체에 다른 객체에 영향을 주지 않으면서 동적으로 투명하게 기능을 추가하기 위해 • 제거될 수 있는 기능 • 상속에 의한 확장이 불합리한 방법일 때
  • 51. Structural Patterns  Decorator Benefits • 단일(다중) 상속보다 유연함 • 상위 계층의 클래스에 feature가 몰리는 것을 방지 Drawbacks/consequences • 서로 연결된 작고 많은 수의 객체가 생기기 때문에, 전체 시 스템을 잘 이해하고 있지 않으면 커스트 마이징하거나 디버 깅이 어려울 수 있음. • Decorator의 chain이 긴 경우 performance overhead가 발 생할 수 있음.
  • 52. Structural Patterns  Facade Definition 서브시스템의 인터페이스 셋이 되는 통합된 인터페이스 환경을 제공합니다. Facade는 서브시스템의 이용을 쉽게 하는 고수준 의 인터페이스를 정의합니다.
  • 54. Structural Patterns  Facade Example StructuralFacade.java javax.faces.context.FacesContext, it internally uses among others the abstract/interface types LifeCycle, ViewHandler, NavigationHandler and many more without that the enduser has to worry about it (which are however overrideable by injection). javax.faces.context.ExternalContext, which internally uses ServletContext, HttpSession, HttpServletRequest, HttpServletResponse, etc.
  • 55. Structural Patterns  Facade Where to use • 복잡한 서브시스템의 간단한 인터페이스를 제공하고 싶을 때 • 클라이언트와 구현된 코드 사이에 의존 관계가 많을 때 • 서브시스템을 레이어로 나누고 싶을 때
  • 56. Structural Patterns  Facade Benefits • 클라이언트에게 서브시스템 구성요소를 숨김 • 클라이언트가 관여하는 객체 수가 줄어들고 서브시스템 사용 을 쉽게 함 • 서브시스템과 클라이언트간에 커플링을 약하게 함 Drawbacks/consequences • 어플리케이션이 서브시스템 클래스를 사용하려고 할 때 이를 막지는 못함. 그러므로 쉬운 사용방법과 일반적인 방법 중에 하나를 골라서 사용할 수 있음
  • 57. Structural Patterns  Flyweight Definition 공유를 통해 많은 수의 작은 객체들을 효과적 지원합니다.
  • 59. Structural Patterns  Flyweight Example StructuralFlyweight.java java.lang.Integer#valueOf(int) (also on Boolean, Byte, Character, Short, Long, Float and Double)
  • 60. Structural Patterns  Flyweight Where to use • 어플리케이션이 많은 수의 객체를 사용할 때 • 객체의 양이 많아 저장 비용이 클 때 • 대부분 객체의 상태를 객체 외적인 것으로 만들 수 있을 때 • 많은 객체 그룹이 객체 외적인 요소가 제거된 상대적으로 작 은 수의 공유 객체로 교체가 가능할 때. • 어플리케이션이 객체의 identity에 의존적이지 않을 때.
  • 61. Structural Patterns  Flyweight Benefits • 공간 절약(flyweight이 공유된 만큼 더 증가) • 객체 생성을 줄임 Drawbacks/consequences • Flyweight은 런타임에 연산비용이 증가할 수 있음(공간 절약 된 부분에서 절충 될 수 있음)
  • 62. Structural Patterns  Proxy Definition 다른 객체의 접근 제어를 위한 Surrogate나 Placeholder를 제 공 Also Known As Surrogate
  • 65. Structural Patterns  Proxy Where to use • remote proxy는 다른 주소 공간을 위한 local representative를 제공 • virtual proxy는 요구에 따라 생성되는 고비용 객체를 생성 • protection proxy는 오리지널 객체의 접근을 제어(권한) • smart reference는 단순 포인터를 대체하는 것으로 객체에 대한 접근이 이루어졌을 때 추가적인 동작을 함
  • 66. Structural Patterns  Proxy Benefits • remote proxy는 객체가 다른 주소공간에 존재한다는 사실을 숨길 수 있음 • virtual proxy는 퍼포먼스를 최적화 시킬 수 있음(필요할 때 만 객체 생성을 한다는 방법 등) • protection proxy와 smart reference는 객체에 대한 접근이 일어났을 때 추가적인 보호 작업을 할 수 있음. Drawbacks/consequences • 객체에 대한 추가적인 추상 레벨을 제공(어떤 객체에 직접 접 근하는것과 프록시를 통해 접근하는 것에는 차이가 있을 수 있으며 이것은 제작자가 의도하거나 의도하지 않은 것 일 수 있음)
  • 68. Behavioral Patterns  Chain of Responsibility Definition 한 개 이상의 객체에게 request를 핸들링 할 수 있게 기회를 제 공함으로서 request sender와 receiver간의 커플링을 피합니다.
  • 69. Behavioral Patterns  Chain of Responsibility Structure
  • 70. Behavioral Patterns  Chain of Responsibility Example BehavioralChain of Responsibility.java java.util.logging.Logger#log() javax.servlet.Filter#doFilter()
  • 71. Behavioral Patterns  Chain of Responsibility Where to use • 한 개 이상의 객체가 요청을 핸들링 하고 핸들러는 우선순위 를 모를때. 핸들러는 자동으로 지정해 주어야만 함 • 예상 receiver가 누구인지 명시하지 않고, 몇몇 객체 중 하나 에게 요청을 발행하고 싶을 때 • 요청을 처리할 객체 셋이 동적으로 정해져야 할 때
  • 72. Behavioral Patterns  Chain of Responsibility Benefits • 커플링을 줄임 • 핸들러 할당의 유연성을 높임 Drawbacks/consequences • 수신이 보장되지 않음
  • 73. Behavioral Patterns  Command Definition 요청을 객체로 캡슐화 함. 그렇게 함으로서 다른 요청들을 매개 변수화 시킬 수 있게 하고, 큐나 로그를 사용할 수 있고, 되돌리 기 연산을 지원할 수 있음. Also Known As Action, Transaction
  • 75. Behavioral Patterns  Command Example BehavioralCommand.java All implementations of java.lang.Runnable All implementations of javax.swing.Action
  • 76. Behavioral Patterns  Command Where to use • action 수행을 위해 객체를 매개변수화 할때 • 각기 다른 시간의 세부화된, 큐, 실행 요청 • 되돌리기(undo) 지원 • system crash시 다시 적용시키기 위한 변경사항 로깅 지원 • 기본 연산으로 만들어진 상위레벨 연산 체계의 구조를 만들 고 싶을때. 이러한 구조중 일반적인 것으로 transaction과 같 은게 있음.
  • 77. Behavioral Patterns  Command Benefits • 요청을 저장할 수 있다. • 관련된 특정 action이나 event를 모을 수 있다. • 다른 action을 발행하는 것이 가능하다. • command 객체는 multiple command를 포함할 수 있다. • 되돌리기 연산을 지원할 수 있다. Drawbacks/consequences • action을 담기 위한 작은 클래스들이 많이 생긴다는 단점이 있으나 큰 문제는 안 된다.
  • 78. Behavioral Patterns  Interpreter Definition 주어진 언어에 대해 그 언어로 된 문장을 인터프리터가 해석할 표현식을 정의합니다.
  • 81. Behavioral Patterns  Interpreter Where to use • 문법이 단순할 때 • 효율성이 중요 고려 사항이 아닐 때
  • 82. Behavioral Patterns  Interpreter Benefits • 문법의 변경, 확장이 용이 • 문법을 구현하는 것이 쉬움 • 새로운 표현식 해석 방법 추가가 용이 Drawbacks/consequences • 복잡한 문법을 유지하는 것은 어려움
  • 83. Behavioral Patterns  Iterator Definition 하단 구현부를 노출하지 않고 집합 객체의 element에 순차적으 로 접근할 수 있는 방법을 제공 Also Known As Cursor
  • 85. Behavioral Patterns  Iterator Example All implementations of java.util.Iterator (thus among others also java.util.Scanner!). All implementations of java.util.Enumeration
  • 86. Behavioral Patterns  Iterator Where to use • 내부 구현을 노출하지 않고 집합 객체의 컨텐츠에 접근하려 할 때 • 집합객체의 다양한 traversal 법을 제공 하려 할 때 • 여러가지 집합 구조에 동일한 인터페이스를 제공하려 할 때
  • 87. Behavioral Patterns  Iterator Benefits • 같은 iterator가 다른 aggregate에 사용될 수 있음 • 다양한 형태의 traversal 방법을 지원 • Aggregate interface를 단순화 시킴 • iteration이 일어나는 내부구조를 캡슐화 Drawbacks/consequences • Thread safe 하지 않을 수 있음. (Memento를 이용하는 등으 로 해결 가능)
  • 88. Behavioral Patterns  Mediator Definition 객체 셋(set)이 어떻게 상호작용하는지를 캡슐화하는 객체를 정 의합니다. Mediator는 각 객체가 명시적으로 레퍼런싱 하지 못 하도록 하여 커플링을 약화시키고 그들의 상호작용이 독립적으 로 일어날 수 있게 해줍니다.
  • 90. Behavioral Patterns  Mediator Example BehavioralMediator.java java.util.Timer (all scheduleXXX() methods) java.util.concurrent.Executor#execute() java.util.concurrent.ExecutorService (the invokeXXX() and submit() methods) java.util.concurrent.ScheduledExecutorService (all scheduleXXX() methods) java.lang.reflect.Method#invoke()
  • 91. Behavioral Patterns  Mediator Where to use • 객체 셋(set)이 잘 정의된 방법으로 커뮤니케이트 하나 복잡 한 방법을 사용한다. • 객체간 레퍼런싱 한게 많고, 커뮤니케이트가 많아서 객체 재 사용이 어렵다. • 몇몇 클래스 간의 분산된 행동들이 서브클래싱을 많이 하지 않고 커스트마이징 될 수 있어야 할 때
  • 92. Behavioral Patterns  Mediator Benefits • 서브클래싱을 제한 • 동료간 커플링을 제거 • 객체 프로토콜을 단순화 • 객체의 협력 방법을 추상화 • 컨트롤을 집중시킴 Drawbacks/consequences • 퍼포먼스 이슈를 가질 수 있음, mediator가 병목지점이 될 수 있음
  • 93. Behavioral Patterns  Memento Definition 캡슐화를 침범하지 않고, 객체의 내부 상태를 캡쳐해서 다음에 재사용할 수 있게 함. Also Known As Token
  • 95. Behavioral Patterns  Memento Example BehavioralMemento.java java.util.Date (the setter methods do that, Date is internally represented by a long value) All implementations of java.io.Serializable All implementations of javax.faces.component.StateHolder
  • 96. Behavioral Patterns  Memento Where to use • 객체 상태의 스냅샷을 저장하고 복원해야만 할 때 • 인터페이스를 통해 직접 상태를 얻게 되면 내부 구현을 노출 시켜 객체의 캡슐화를 위배하게 될때
  • 97. Behavioral Patterns  Memento Benefits • 캡슐화된 상태를 유지 • 원본 객체가 단순해짐 • 모듈 사이의 일관성을 증진시킴 Drawbacks/consequences • memento 사용이 비쌀 수 있음 • 몇몇 언어에서 구현이 어려움
  • 98. Behavioral Patterns  Observer Definition 일대 다의 의존관계를 객체간에 설정해 두어 한 오브젝트의 상 태가 바뀌면 의존성을 가진 모든 객체가 상태를 자동으로 업데 이트 할 수 있게 함 Also Known As Dependents, Publish-Subscribe
  • 100. Behavioral Patterns  Observer Example BehavioralObserver.java java.util.Observer/java.util.Observable (rarely used in real world though) All implementations of java.util.EventListener (practically all over Swing thus) javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionAttributeListener javax.faces.event.PhaseListener
  • 101. Behavioral Patterns  Observer Where to use • 한 객체가 정보를 발행하길 원하고 다른 객체가 이 정보를 받 아야 할 필요가 있을 때
  • 102. Behavioral Patterns  Observer Benefits • publish와 subscriber 간 결합상태를 약하게 만듬 publisher 는 어떤, 얼마나 많은 subscriber가 존재하는지 알 필요가 없 음 Drawbacks/consequences • 모든 subscriber에게 불필요한 정보를 전달해서 오버헤드를 야기 할 수 있음
  • 103. Behavioral Patterns  State Definition 내부 state가 변경되었을 때 객체가 자신의 행동을 변화시킬 수 있도록 함. 객체는 자신의 클래스를 변경하는 것 같이 보임. Also Known As Objects for States
  • 105. Behavioral Patterns  State Example BehavioralState.java All implementations of java.util.Iterator javax.faces.lifecycle.LifeCycle#execute() (controlled by FacesServlet, the behaviour is dependent on current phase (state) of JSF lifecycle)
  • 106. Behavioral Patterns  State Where to use • 객체의 행동이 state에 의존적이고, state에 따라 런타임에 행동이 변경되어야만 할 때 • 연산들이 객체의 state에 의존하는 크고 많은 조건을 가질 때
  • 107. Behavioral Patterns  State Benefits • 각각의 state를 클래스로 정의했을 때보다 코드가 깔끔하다 • 클래스가 상수가 아닌 state를 나타내도록 사용한다. Drawbacks/consequences • 작은 크기의 클래스 객체를 많이 만든다. 하지만, 프로그램이 프로세스 상에서 간결하고 명확해진다.
  • 108. Behavioral Patterns  Strategy Definition 알고리즘들의 군을 정의하고, 각각을 캡슐화 시켜서, 상호 교환 할 수 있도록 만든다. Strategy는 알고리즘을 그것을 사용하는 클라이언트로 부터 매우 독립적으로 만든다. Also Known As Policy
  • 110. Behavioral Patterns  Strategy Example BehavioralStrategy.java java.util.Comparator#compare(), executed by among others Collections#sort(). javax.servlet.http.HttpServlet, the service() and all doXXX() methods take HttpServletRequest and HttpServletResponse and the implementor has to process them (and not to get hold of them as instance variables!). javax.servlet.Filter#doFilter()
  • 111. Behavioral Patterns  Strategy Where to use • 많은 관련 클래스들이 그들의 행동만 다를 때 • 한 알고리즘의 다양한 형태가 필요할 때 • 알고리즘이 클라이언트가 모르는 데이터를 사용할때 • 한 클래스가 많은 행동을 정의하고 그들의 연산은 많은 조건 문으로 표현될때
  • 112. Behavioral Patterns  Strategy Benefits • 많은 조건문을 줄임 • 복잡하고 알고리즘 의존적인 데이터를 숨김 • 서브클래싱의 대안 Drawbacks/consequences • 클라이언트는 strategy들의 차이점을 알고 있어야 함 • 객체 수가 증가
  • 113. Behavioral Patterns  Template Method Definition 객체의 연산에는 알고리즘의 뼈대만 정의하고, 몇몇 단계의 구 현은 서브클래스로 미룹니다. Template Method는 알고리즘 구 조의 변경 없이 서브클래스에게 이러한 몇몇 단계의 알고리즘의 부분들을 재정의 할 수 있게 합니다.
  • 114. Behavioral Patterns  Template Method Structure
  • 115. Behavioral Patterns  Template Method Example BehavioralTemplate Method.java All non-abstract methods of java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer. All non-abstract methods of java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap. javax.servlet.http.HttpServlet, all the doXXX() methods by default sends a HTTP 405 "Method Not Allowed" error to the response. You're free to implement none or any of them.
  • 116. Behavioral Patterns  Template Method Where to use • 알고리즘 중 변경되지 않는 부분의 구현을 하고 변경될 수 있 는 부분은 서브클래스가 구현하도록 할 때 • 코드 중복을 피하기 위해 버스클래스 간의 공통 행동을 공통 클래스안에 모아두고 싶을 때 • 서브클래스 확장을 컨트롤 하기 위해
  • 117. Behavioral Patterns  Template Method Benefits • 코드 재사용 • 코드 중복 줄임 Drawbacks/consequences • 연산이 오버라이드가 가능한지 꼭 해야 하는지 정하는 것이 중요
  • 118. Behavioral Patterns  Visitor Definition 객체 구조의 element에게 수행될 연산을 표현. Visitor는 이것 이 수행될 element 클래스의 변경 없이 새로운 연산을 정의할 수 있게 해줌.
  • 120. Behavioral Patterns  Visitor Example BehavioralVisitor.java javax.lang.model.element.AnnotationValue and AnnotationValueVisitor javax.lang.model.element.Element and ElementVisitor javax.lang.model.type.TypeMirror and TypeVisitor
  • 121. Behavioral Patterns  Visitor Where to use • 객체 구조가 다른 인터페이스를 가진 많은 클래스 객체를 포 함하고 있으며 실제(인터페이스가 구현된) 클래스에 맞게 이 러한 객체가 연산을 수행할 수 있게 하고 싶을 때. • 객체 구조 내의 객체에게 다른 것과 구별되고 관련성이 없는 많은 연산이 수행될 필요가 있고, 이러한 연산들에 의해 그들 의 클래스가 오염되는 것을 피하고 싶을 때 • 객체 구조를 정의하는 클래스들은 변경이 적지만 가끔 새로 운 연산을 정의하고 싶을 때
  • 122. Behavioral Patterns  Visitor Benefits • 새로운 연산을 추가하기가 쉽다. • 관련된 연산을 모으고, 관련 없는 연산을 분리시킴 • element를 클래스 계층에 따라 접근 • state를 누적시킬 수 있음 Drawbacks/consequences • 새로운 종류의 element class를 추가시키기 어렵다. • 캡슐화를 깰 수 있음
  • 123. Design Patterns  Quiz 아래 문제에서 플랫폼은 동일하다고 가정합니다. 그 외 필요한 가정은 스스로 하면 됩니다. UML을 사용하는 경우 파일은 이미지 파일로 저장해서 주십시오. (UML을 사용할 의무는 없습니다.) 1. 오디오 플레이 라이브러리를 만들려고 합니다. 지원하는 파일 형식은 런타임에 추가, 제거 될 수 있고 별도 플러그인으로 존재합니다. 편의상 해당 플러그인은 파일 오픈, 파일 형식 디텍팅과 재생, 정지, Seek의 기능을 제공한다고 가정 합니다. 파일 형식을 디텍팅하게 되면, 음악가 정보, 제목, 섬네일을 추출해 줍니다. 플러그인은 여러 업체에서 공급하기 때문에 인터페이스가 다를 수 있다고 가정합니다. 라이브러리를 디자인하고, 어떻게 코딩할 것인지 간단히 설명하십시오. 이 라이브러리는 플러그인과 마찬가지로 파일 오픈, 파일 메타데이터, 재생, 정지, seek기능을 제공 해야 합니다. 2. 위에서 만든 플레이어 라이브러리를 가지고, 태블릿과 핸드폰에서 사용할 UI 어플을 만들려고 합 니다. 핸드폰과 태블릿 화면크기가 다른 관계로 다른 화면 구성을 가지고 있다고 가정합니다. 플레이어 라이브러리는 교육대상자 여러명이 만든것을 사용하기 때문에, 인터페이스가 같지 않을 수 있습니다.