본문 바로가기

Theory/Design Pattern25

MVC Pattern MVC란 MVC는 Model, View, Contorller의 약자이다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성 요소를 세 가지의 역할로 구분한 패턴이다. 위 그림에서 USER가 이벤트를 발생 시키면 CONTROLLER가 MODEL을 통해 데이터를 가지고 온다. 그 결과물을 VIEW에서 받아 USER에서 전달하게 되는 형식이다. 모델(Model) DATA, 정보, 초기 값, 변수, 상수 또는 데이터를 가공하는 컴포넌트 등을 뜻한다. 모델의 규칙 1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다. 2. 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다. 3. 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야만 한다. - 변경 통지를 CONTROLLER에게 해야 한다. .. 2022. 5. 23.
Visitor Pattern Visitor Pattern object구조의 요소들을 수행 할 operation을 나타낸다. Visitor는 요소 class의 변화없이 새로운 operation을 정의 할 수 있다. 위 그림은 Composite pattern에서 사용하였던 구조이다. 위와 같은 구조가 있을 때 각 요소에 대한 operation은 직접정의 할 수 있겠지만 공통된 operation은 visitor pattern내에 정의하여 사용 할 수 있다. 코드의 재사용성이 올라가며 추가적인 operation이 필요할 때 모든 요소들에 추가하는 것이 아니라 visitor에 추가하면 되기 때문에 유지보수에도 용이하다. solution object구조의 요소들을 대신 수행 할 Visitor object를 정의한다. 이 object는 요소들을.. 2022. 5. 22.
Template Method Pattern Template Method Pattern 알고리즘에서 특정 step만을 수정할 때 사용한다. subclass의 operation을 바꾸고 싶을 때 parent class에서 상속받아 재정의 한다. 하지만 이것은 전체를 다시 다 정의해야 하며 특정 부분만을 수정하는 것이 불가능하다. template method는 불변하는 코드와 변하는 코드를 나눠 불변하는 코드의 중복을 없애는 방법이다. Solution 변하는 코드를 함수(primitive)로 바꾸어 subclass에서 상속하여 변경시킨다. 반면에 불변 코드는 상위 클래스에 그대로 둔다. Motor public abstract class Motor { protected Door door; private MotorStatus motorStatus; pub.. 2022. 5. 22.
Strategy Pattern Strategy Pattern 알고리즘의 family를 정의하고 캡슐화한다. 또한 서로 상호교환도 가능하다. Strategy Pattern은 알고리즘을 독립적으로 다양하게 사용 할 수 있게 한다. 어떻게 알고리즘을 직접 구현하는 대신에 run-time에 환경설정을 할 수 있을까? 어떻게 알고리즘을 run-time에 교환하거나 선택할 수 있을까? Context내에 알고리즘을 switch나 if-else문으로 작성한다면 나중에 독립적으로 수정하기가 어렵다. 또한, 클래스가 복잡해지고 재사용성이 어려워진다. 알고리즘을 개발기간동안 확장되어지고 최적화되며 대체되기도 하기 때문에 결합을 약하게 해야만 한다. Solution 이 패턴의 목적은 상속을 통해 독립적으로 알고리즘을 구현하는데 있다. Strategy ob.. 2022. 5. 22.
State Pattern State Pattern internal state가 변경되었을 때 행위를 교체하는 것을 허용한다. internal state가 변경되었을 때 행동을 어떻게 교체할까? 어떻게 state기반 행동을 명시하고나서 새로운 state가 추가하거나 이미 존재하는 state의 행동을 독립적으로 변경할까? 주문 시스템에서 주문 Object가 있다고 하자. 이 주문을 취소하는 상태가 있을수도 있고, 취소했다가 재구매하는 상태 등 여러가지 상태가 존재 할 수 있다. State Pattern은 주문 or 상품에 대해서 독립적으로 state를 만들어 새로운 state가 필요하거나 operation을 독립적으로 교환 할 수 있도록 해준다. Solution Context와 State를 분리하고, State를 상속받아 State.. 2022. 5. 21.
Observer Pattern Observer Pattern object사이에 one-to-many 의존성을 정의하여 one object가 변경될 때 이것을 의존하고 있는 모든 object들을 자동적으로 업데이트 및 통지하는 것이다. 어떻게 one-to-many object들 사이에 의존성을 강한 결합없이 정의 할 수 있을까? 어떻게 one object가 many object에게 통지 할 수 있을까? 위 그림과 같이 수정이나 이벤트가 있을 경우 모두 등록된 object에게 자동적으로 수정 분을 공지하고 업데이트 하는 것이다. Solution Subject는 Observer의 container를 가지고 있으며, Observer를 추가하고 업데이트 하는 함수를 갖는다. public abstract class Subject { privat.. 2022. 5. 21.
Memento Pattern Memento Pattern 캡슐화를 위배하지 않고, object의 내부 state를 외부화하고 캡쳐해서 나중에 재사용하기 위해 사용한다. checkpoint나 undo를 구현하는데 용이하다. object의 데이터 구조나 구현은 object내에 숨겨져 있고 보이지 않고 object 외부에서 접근할수도 없다. 문제점은 internal state를 object의 외부로스터 접근 없이 외부로 저장시키는 것이다. memento pattern은 internal state의 스냅샷을 저장해서 나중에 state를 재사용 할수 있도록 한다. 동시에 캡슐화는 위배하지 않는다. * internal state : 모든 내부 데이터와 변수들 Solution Originator는 Memento의 현재 상태를 가지고 있는 객체이.. 2022. 5. 21.
Mediator Pattern Mediator Pattern 서로를 참조하고 있는 object들의 결합을 끊고 상호작용 할 수 있게 만드는 방법이다. 서로를 참조하고 있는 object들의 결합을 끊을 수 있을까? 어떻게 독립적으로 이러한 object들을 사호작용 할 수 있도록 할까? 이렇게 서로를 참조하여 강한 결합이 있는 obejct들은 독립적으로 수정, 구현, 재사용이 어렵다. solution Colleague1이 변할 때마다 자기 자신(this)를 Mediator1에 넘겨준다. public class Colleague1 implements Colleague { private Mediator mediate; private String state; public Colleague1(Mediator mediate) { this.medi.. 2022. 5. 15.
Iterator Pattern Iterator Pattern aggregate object의 내부를 알지 못해도 요소들을 접근 하는 방법이다. 어떻게 object의 내부를 표출시키지 않고 요소들을 접근할 수 있을까? aggregate object란 array, set같은 object를 이야기 한다. 이러한 object의 요소들을 접근하기 위해 내부를 노출시킨다면 캡슐화에 위배된다. solution Aggregate와 Iterator를 분리하여 Aggregate내에 Iterator를 내부 클래스로 구현한다. 왜 분리해서 구현해야 할까? aggregate object와 독립적으로 새로운 operation을 추가하기가 어렵다. 또, 요소를 탐색하는데 여러가지 iterator를 둘 수 없다. public class Aggregate1 imp.. 2022. 5. 15.
Interpreter Pattern Interpreter Pattern 자연어에서 문법에 따라 문장을 해석하는 역할을 한다. 문법은 언어의 구조를 표현하는 방법을 의미한다. Interpreter는 언어의 문장을 통역하는 규칙의 리스트를 가지고 있다. 언어의 모든 문장은 abstract syntax tree(AST)를 통해 class들을 instance하고 있다. Solution 1. Expression class hierarchy구조로 문법을 정의한다. - expression을 해석할 수 있는 interface를 정의한다. public abstract class AbstractExpression { private String name; public AbstractExpression(String name) { this.name = name;.. 2022. 5. 14.
Command Pattern Command Pattern request를 object로 캡슐화 한 다음 캡슐화된 object를 다른 요청이나 큐 등 다른 operation의 파라미터로 사용하게 하는 것이다. request의 요청자와 요청간의 결합을 어떻게 회피 할 수 있을까? 어떻게 특정 object를 request의 환경이 될 수 있도록 할까? compile-time에 request의 요청자와 특정 request를 결합시켜버린다면 run-time에는 request를 명시하는 것이 어렵다. 특정 operation을 명시하고 싶을 때 하드코딩을 회피해야 한다. 그렇게 한다면 compile-time과 run-time에 요청 처리에 대한 변화를 주기 쉬워진다. Solution Receiver1은 Reuqest, Command는 Recie.. 2022. 5. 12.
Chain Of Responsibility Pattern Chain Of Responsibility Pattern request가 있을 때 request를 다룰 수 있는 기회를 특정 object에게 준다. 이러한 object가 연결되어 있는 chain에 reuqest를 넣고, object들이 이 request를 다룰 때마다 chain을 통과하는 방식을 사용한다. 어떻게 request의 송신자와 수신자가 서로 의존하게 되는 것을 막을 수 있을까? 어떻게 request를 여러 object를 통하여 처리 할 수 있을까? 위 그림처럼 Receiver object들을 여러개 묶어 chain으로 만들어 놓고 요청에 대해서 각 처리하도록 한다. Solution Handler를 다룰 수 있도록 상속받은 Receiver class를 만든다. public class Receiv.. 2022. 5. 10.
Flyweight Pattern Flyweight Pattern Flyweight Pattern은 미세하게 나누어진 매우 많은 object들을 효율적으로 공유하는 것이다. 미세하게 많은 양으로 나누어진 object를 어떻게 효율적으로 지원할까? 어떻게 많은 양의 object를 생성하는 것을 회피하면서 공유 할 수 있을까? 어떻게 object들을 물리적으로 적은 양으로 생성하면서 논리적으로 문제가 없게 object들을 표현할 수 있을까? 많은 object들을 다루기 위한 기본적인 방법은 필요한 만큼 object들을 생성하는 것이다. 이러한 방법은 많은 메모리를 차지하고 overhead를 일으킬 수 있다. 이것들을 해결하기 위해서는 물리적으로 생성되는 object의 수를 줄여야 하면서 논리적으로도 모든 객체가 존재해야만 한다. soluti.. 2022. 5. 9.
Facade Pattern Facade Pattern subsystem에 있는 여러 interface를 통합으로 묶어 줄 수 있는 interface를 정의하는 것이다. Facade는 subsystem을 쉽게 할 수 있도록 도와주는 higher-level interface를 정의하는 것이다. 복잡한 subsystem에 단순한 interface를 어떻게 제공 할 수 있을까? subsystem에 client와 object사이에 응집도를 어떻게 줄일 수 있을까? subsystem의 Client는 오직 Facade interface에 대해서만 알고 참조해야만 한다. 또, subsystem에 있는 서로 다른 interface에 대해서 독립적이게 하여 의존을 줄이고 client가 쉽게 구현, 수정, 테스트 그리고 재사용 하기 쉽게 한다. 왼쪽.. 2022. 5. 9.
Decorator Pattern Decorator Pattern 추가적인 기능을 object에 유동적으로 부여하는 것이다. subclassing이나 상속의 유동적 대안책으로 사용된다. 어떻게 object에 추가적인 책임을 유동적으로 부여 할 수 있을까? 어떻게 object의 기능을 run-time에 확장시킬 수 있을까? 이 Pattern은 상속처럼 compile-time에 클래스의 기능을 확장하는 것을 회피하기 위해서 사용된다. 예를 들어 web application에서는 버튼이나 스크롤의 이벤트에 따라 기능이 추가될 수도 있다. 이럴 경우 run-time에 기능을 추가하는 것이 필요한데 Decorator Pattern으로 해결이 가능하다. Solution Component에 기본적인 함수를 정의를 해놓고 Component를 상속받는다.. 2022. 5. 8.
Composite Pattern Composite Pattern Composite는 Object를 tree구조로 표현하기 위해 사용한다. Composite는 Client가 object와 object의 구성품을 균일하게 다루게 한다. 어떻게 object를 tree구조로 구성할까? Composite object를 가지고 어떻게 subtree를 구성할까? Tree구조는 OOP syetem에서 매우 자주 사용하기 때문에 composite는 패턴은 유용하다. Tree구조는 Leaf Object와 Composite object로 구성되어 있다. Leaf Object는 Leaf Node와 같은 역할을 한다고 보면되고 Composite object는 중간 Node이라고 보면 된다. 그래서 Composite object는 children을 가질 수 있.. 2022. 5. 5.
Proxy Pattern Proxy Pattern Proxy Pattern은 다른 object를 통제 할 수 있는 대리자를 만드는 것이다. 어떻게 object에 접근하는 것을 통제 할까? object에 접근할 때, 추가적인 기능을 어떻게 제공할까? Solution Proxy는 RealSubject를 생성자로 받아 operation하게 한다. public class Proxy extends Subject{ private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public String operation() { return "Hello World from proxy and " + .. 2022. 4. 24.
Bridge Pattern Bridge Pattern abstraction과 implementation을 분리하여 이 2가지를 독립적으로 다양하게 할 수 있다. abtraction과 implementation을 어떻게 독립적으로 다양하게 할 것인가? 어떻게 implementation을 run-time에 선택하거나 교환할 수 있을까? 서버를 사용할 때, 여러개의 다른 하드웨어를 가진 환경이 존재 할 수 있다. application을 서로 다른 하드웨어 환경에 적절히 동작하기 위해서 필요 할 수 있다. Solution Abstraction을 통해 Implementor의 구현부를 사용 한다. 따라서, run-time에 implementor를 상속받은 클래스만 바꿔주면 되기 때문에 Abstraction과 implementation이 독립.. 2022. 4. 24.
Prototype Pattern Prototype Pattern Prototypical instance를 사용하여 create할 object의 종류를 명시해주고, prototype 복사하여 새로운 object를 생성한다. run-time에 생성할 어떤 object를 명시하여 생성할 것인가? 클래스를 어떻게 동적으로 instantiation할 것인가? prototype으로써 역할을 하기 위해서 object는 스스로를 copy할 수 있는 Prototype interface를 구현해야한다. Solution Prototype interface clone메서드를 정의하고 Product1에서 사용한다. Product1에서 clone을 통해 새로운 객체를 반환하도록 한다. public class Product1 implements Prototype.. 2022. 4. 23.
Factory Method Pattern Factory Method Pattern object를 생성하는 interface를 정의지만 instantiation할 클래스를 subclass에 위임하는 것이다. 어떤 class를 instantiation할지 subclass에서 결정하기 위해서는 object를 어떻게 생성해야 할까? 어떻게 instantiation를 subclass로 위임할 수 있을까? Creator클래스 내부에 object를 직접적으로 생성 할 수 있도록 한다. 이것은 Creator클래스가 특정 object를 승인해주고 이 클래스로부터 독립적으로 instantiation를 변경하는 것은 불가능하게 한다. solution 결합을 느슨하기 위해 Creator Interface를 상속받아 Creator1을 만들고 factoryMethod내.. 2022. 4. 10.
Builder Pattern Builder Pattern 빌더패턴은 복잡한 객체의 구조를 어떻게 더 효율적이게 관리하며, 같은 구조여도 서로 다른 표현으로 객체를 생성 할 수 있을지에 대해서 다룬다. 복잡한 객체의 구조를 분리시켜 같은 구조이지만 서로 다른 표현으로 객체를 생성할 수 있을까? 위 그림과 같이 만약에 new ProductA1(), new ProductB1() 등.. 여러가지 클래스를 특정 Object에서 생성하는 경우 유연함이 떨어진다. 또한, Object도 정의된 생성자로만 객체 생성해야만 한다. Solution 복잡한 object내부를 부분으로 나눠 build object내에서 create할 수 있도록 한다. 그래서 직접 new로 클래스를 생성하기 보다는 build내에서 instantiation하도록 한다. pub.. 2022. 3. 29.
ABSTRACT FACTORY PATTERN ABSTRACT FACTORY PATTERN 의존적이고 연관되어 있는 구조에서 구체적으로 명시되어있는 클래스보다는 인터페이스를 제공하는 것이다. 필수적으로 필요한 객체를 어떻게 독립적으로 생성할까? 연관되고 의존적이지만 객체들의 서로 다른 Family는 어떻게 생성할까? ProductA라는 interface를 상속받아 ProductA1이라는 class를 만들었다. 만약에 client에서 new ProductA1()를 할 경우 어떤 문제가 있을까? interface ProductA가 인스턴스화 되기 전에 ProductA1이 먼저 인스턴스화 된다면 컴파일이나 런타임 중 에러가 날 가능성이 있으므로 직접적으로 ProductA1를 인스턴스하는 것은 회피하는 것이 좋다. Solution 결합도를 낮추기 위해 Cl.. 2022. 3. 27.
ADAPTER PATTERN ADAPTER PATTERNS 이 패턴의 의도는 호환되지 않은 인터페이스를 호환되도록 변경해주는 것이다. 인터페이스 요구사항과 맞지 않을 때 어떻게 재 사용 가능할까? 서로 호환되지 않은 클래스끼리 호환시킬 수 있을까? Adapter가 하는 역활은? Adapter의 역할은 8핀 충전기를 C타입으로 바꾸는 포트라고 생각하면 좋다. Solution 위에서 말한 것 처럼 8핀을 가진 아이폰 객체를 C타입의 충전기를 통해서 충전을 해보자. Interface의 정의 interface로 C타입포트와 8핀 포트를 정의한다. package AdapterPattern; public interface CtypePort { void charge(); } package AdapterPattern; public interfac.. 2021. 7. 22.
SINGLETON PATTERN Sinlgeton pattern 싱글톤 패턴은 "유일한 인스턴스를 생성하고 이것을 global하게 접근할 수 있도록 제공하는 것이다." 싱글톤 패턴은 아래의 2가지 문제에 대해 해결책을 제시해 준다. 1.어떻게 단 한개의 인스턴스를 생성 할 수 있을까? 2.이 유일한 인스턴스를 global하게 접근 할 수 있을까? 싱글톤 패턴은 왜 필요할까? 증권사 시스템을 개발한다고 가정해보자! 한꺼번에 다양한 사람들의 주문이 들어오는데 여러객체가 각 각 처리한다면 어떤 현상이 발생할까? 매도 주문을 100개 밖에 없는데 1000개가 처리되는 기이한 현상이 일어날 것이다. 단 한개의 인스턴스가 처리하게 만든다면 매수 주문을 100개 이상 처리 할 수 없도록 만들 수 있다. Background static 접근 제한자는.. 2021. 7. 20.
Introduction Design Principles 1. Program to an interface, not an implementation ( 구현이 아니라 interface를 프로그램하라! ) 이 디자인 원리는 구현 의존성을 굉장히 줄여준다. Clients는 interface를 참고하고 구현과는 독립적이다. 이것은 구현은 변화 없이 존재하는 clients마다 독립적으로 다양 할 수 있다는 것을 의미한다. 이것은 여기에서 다루는 일반적인 디자인 패턴의 주제이고 한 시스템이 구현의 관점이 아닌 interface의 관점으로 쓰여진다는 것을 보장한다. 결론적으로 clients는 interface에 의존한다. interface를 다양하게 하는 것은 존재하는 clients를 없앨 수 있다. 그러므로 interface는 신중하게 디.. 2019. 6. 8.