옵저버 패턴 (Observer Pattern) 옵저버 패턴은 개개체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드를 통하여 관찰 대상자가 직접 옵저버들에게 통지하여 상태를 동기화 할 수 있도록 하는 디자인 패턴을 의미합니다. ■ 옵저버 패턴 예제 ▶옵저버 패턴이 적용된 예제를 구현 해보겠습니다. ● Generator : 관찰 대상자를 나타내며, 현재 관찰 대상자에 붙어있는 Observer들을 관리합니다. 뿐만 아니라 현재 관찰 대상자의 상태 정보를 얻기 위한 메서드를 제공하며, 상태 변화시 등록되어 있는 모든 관찰자들에게 상태 변화를 통지해주는 메서드를 제공합니다. ● StringGenerator : Generator를 상속받는 실제 상태 정보를 ..
메멘토 패턴 (Memento Pattern) 메멘토 패턴은 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴을 의미합니다. ■메멘토 패턴 예제 구조 ▶ 실제로 메멘토 패턴을 사용하여 객체 정보를 저장하고 복원하는 예제를 살펴 보겠습니다. 예제는 간단히 String형 데이터 하나와 Int형 데이터 하나에 대한 정보로 가지는 Information 객체를 구현하였습니다. ● User : 메멘토 패턴이 적용 된 Information 객체를 실제로 사용하는 사용자입니다. ● Information : 상태를 저장하고 복원 할 데이터를 가지고 있는 클래스입니다. ● Memento : 특정 시점의 Information의 상태정보를 저장하는 클래스입니다. ● CareTak..
데코레이터 패턴 (Decorator Patter) 중심이 되는 객체에 부가적인 기능을 동적으로 추가하고자 할 때 사용하는 패턴입니다. ■ 데코레이턴 패턴 구조 (예제) 예제는 기본 빵 객체를 대상으로 여러가지 재료를 조합하여 동적으로 햄버거를 만드는 예제입니다. ● Hamburger : 장식할 대상이 가져야 할 공통 인터페이스를 정의합니다. ● Bread : 구체적인 장식 할 대상입니다. 다른 장식 대상을 장식 할 수는 없습니다. ● Ingredient : 장식 할 대상을 장식하는 클래스로 또한 Hamburger의 인터페이스를 가지기 때문에 장식 대상이 될 수도 있습니다. 장식 할 대상의 객체를 참조합니다. ●Shrimps_Patty 와 Bulgogi_Patty : Ingredient의 인터페이스를 구현..
방문자 패턴 (Visitor Pattern) 데이터 구조와 연산을 분리하여 데이터 구조의 원소들을 변경하지 않고 새로운 연산을 추가 할 수 있습니다. 새로운 연산을 추가하려면 새로운 방문자를 추가하기만 하면 됩니다. ■ 방문자 패턴 구조 (예제) 오른쪽에는 Composite 패턴으로 구현 된 File과 Directory로 이루어진 데이터 구조가 있습니다. 다만, 방문자를 수용하기 위해 Element 인터페이스를 상속받아서 accept() 메서드를 각각 구현하고 있으며 각 element의 경로를 구하는 연산 부분이 방문자에서 이루어집니다. 왼쪽에는 방문자로 데이터 구조를 방문하면서 필요한 연산을 수행합니다. 각 element에 접근하기 위한 visit메서드를 오버라이딩 및 오버로딩을 하고 있습니다. ■ 소..
컴포지트 패턴 (Composite Pattern) 객체들을 트리 구조로 구성하여 그릇 객체와 내용물 객체를 동일하게 취급할 수 있도록 만들기 위한 패턴입니다. Composite Pattern Structure ● Component : Leaf와 Composite의 상위 클래스로써 이들을 동일하게 취급 할 수 있도록 공통 인터페이스 정의 ● Composite : 그릇을 나타내는 역할을 하고, 또 다른 그릇을 참조하거나 내용물 객체를 참조 할 수 있음 ● Leaf : 내용물 객체로서, 그릇 객체를 포함 할 수 없음 예제 예제는 디렉토리 구조를 구성하는 예제로 디렉토리는 그릇 객체에 해당되며 파일은 내용물 객체에 해당합니다. 예제의 클래스 다이어그램입니다. Entry 객체는 File과 Directory를 동일..
역할 사슬 패턴 (Chain Of Responsibility) 여러 개의 객체 중에서 어떤 것이 요구를 처리할 수 있는지를 사전에 알 수 없을 때 사용됩니다. 즉 요청 처리가 들어오게 되면 그것을 수신하는 객체가 자신이 처리 할 수 없는 경우에는 다음 객체에게 문제를 넘김으로써 최종적으로 요청을 처리 할 수 있는 객체의 의해 처리가 가능하도록 하는 패턴입니다. 구조 (Structure) ● Handler : 요청을 처리하기 위한 수신자들이 가져야 할 인터페이스를 정의 ● ConcreteHandler : Handler 인터페이스 구현, 각자가 요청 종류에 따라 자신이 처리 할 수 있는 부분을 구현 ● Client : 맨 처음 수신자에게 처리를 요구함 예제 예제는 역할 사슬 패턴을 사용하여 1~20까지의 반..
퍼사드 패턴 (Facade Pattern) Facade는 "건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미합니다. 퍼사드 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 사용 할 수 있게 간단한 인터페이스를 제공해줍니다. 동기 어떤 사람이 영화를 보고자 합니다. 영화를 보기 위해서는 다음과 같은 과정을 거치게 됩니다. 음료를 준비한다 -> TV를 켠다 -> 영화를 검색한다 -> 영화를 결제한다 -> 영화를 재생한다. 123456789101112public void view(){ Beverage beverage = new Beverage("콜라"); Re..
반복자 패턴 (Iterator Pattern) 접근기능과 자료구조를 분리시켜서 객체화합니다. 서로 다른 구조를 가지고 있는 저장 객체에 대해서 접근하기 위해서 interface를 통일시키고 싶을 때 사용하는 패턴입니다. 동기 for(int i=0;i ™ 1 2 3 4 5 6 7 8 public interface Aggregate { public abstract Iterator iterator(); } public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); } Aggregate의 인터페이스를 구현하는 복합 클래스는 반드시 iterator 객체를 생성하는 메서드를 구현합니다. Iterator 인터..
브릿지 패턴 (Bridge Pattern) 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 합니다. 즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 합니다. ■ 브릿지 패턴의 구조 ● Abstraction : 기능 계층의 최상위 클래스. 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출합니다. ● RefindAbstraction : 기능 계층에서 새로운 부분을 확장한 클래스 ● Implementor : Abstraction의 기능을 구현하기 위한 인터페이스 정의 ● ConcreteImplementor : 실제 기능을 구현합니다. ■ 브릿지 패턴 예제 각 '동물'이라는 클래스와 이 동물 클래스가 가질 수 있는 '사냥방법'을..
프록시 패턴 (Proxy Pattern) 'proxy'는 대리인이라는 뜻입니다. 자바 코드에서 생각을 해보면 어떤 클래스의 수행을 대신 수행 하는 것으로 생각 할 수 있습니다. Proxy Pattern을 사용하는 경우는 어떤 클래스의 객체 생성이 오래 걸리는 경우 그 일을 분업을 하여 proxy 클래스에서 처리 할 수 있는 부분은 처리를 하고 proxy 클래스에서 처리 할 수 없는 작업에 대해서만 실제 클래스의 객체를 생성하고 위임하는 방식을 취합니다. ■ 프록시 패턴 구조 ● Client : proxy 패턴을 사용합니다. ● Subject : proxy와 RealSubject가 가져야 할 공통 인터페이스를 정의합니다. ● Proxy : RealSubject에 대해 대리 수행을 실행합니다. ● RealS..
어댑터 패턴 (Adapter Pattern) 어댑터는 변환기로, 서로 다른 두 인터페이스 사이에 통신이 가능하게 합니다. 프로그램에서 어댑터 패턴 디자인이란 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 인터페이스로 변환하고자 할때 사용합니다. ■ 문제 A라는 사람이 B파서를 통해 HTML 문서를 파싱하는 어플리케이션을 만들었습니다. 그러던중 B파서 말고도 다른 종류의 문서도 파싱 할 수 있는 C파서도 필요하게 되었습니다. 살펴보니 C파서와 B파서가 제공하는 인터페이스는 약간의 차이가 있습니다. 이러한 상황에 대해 Adapter Pattern을 적용하여 문제를 해결 해보겠습니다. ■ B파서만 사용하는 기존코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class..
Builder 패턴 빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴입니다. ■ 빌더 패턴(Builder Pattern) 사용 이유 Colored By Color Scripter™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class PersonInfo { private String name; private int age; private String email; private String number; public PersonInfo(String name,int age,String email,String number) { this.name = name; this.age = age;..
Template Method Pattern 상위 클래스에서 처리의 흐름을 제어하며, 하위 클래스에서 처리의 내용을 구체화한다.여러 클래스에 공통되는 사항은 상위의 추상 클래스에서 구현하고, 공통 되지 않는 부분에 대한 상세 구현은 하위 클래스에서 구현한다. 예제 햄버거를 만드는 클래스를 설계 해보겠습니다. 햄버거 종류에는 치즈버거와 불고기버거가 있을 수 있습니다. 1. 빵을 올린다. 2. 패티를 올린다. 3. 양상추를 올린다. 4. 빵을 올린다. 1. 빵을 올린다. 2. 패티를 올린다. 3. 치즈를 올린다. 4. 빵을 올린다. 각 버거는 위에 나온 순서대로 만들어 집니다. 1, 2, 3번 같은 경우는 중복되는 내용입니다. 즉 1, 2, 3 번의 경우 상위 추상 메서드로 올려주고 3번 같은 경우에는 상위에..
Singleton 패턴 디자인 패턴에서 싱글톤 패턴은 특정 클래스에 대해 new 연산자로 생성되는 인스턴스를 Stack 메모리에 한 번만 할당하여 이후에 new 연산자를 통한 객체 생성 요구에 대해서는 최초에 생성되었던 객체를 반환하는 디자인 패턴입니다. 즉 프로그램의 특정 클래스에 대한 유일 객체를 보장하는 패턴이라고 볼 수 있습니다. 일반적으로 앱에서 공통적으로 사용하는 데이터 클래스에 대해서 이와 같은 싱글톤 패턴 형식으로 작성하게 됩니다. 객체 생성을 위한 new 연산자는 해당 클래스의 인스턴스를 stack 메모리에 저장하게 되는데 싱글톤 패턴이 적용된 경우에는 new 사용을 통한 무분별한 인스턴스 생성을 막기 때문에 메모리 낭비를 방지할 수 있습니다. singleton.class 1 2 3 4 ..
Strategy Pattern 알고리즘의 인터페이스를 정의하고, 각각의 알고리즘은 캡슐화하여 동적으로 교체 사용 가능하도록 구현하는 디자인 패턴입니다. 클라이언트와는 독립적으로 구현되기 때문에 새로운 알고리즘을 추가하거나 기존의 알고리즘을 쉽게 변경이 가능합니다. Strategy Pattern Structure ● Context - 실제 각각의 알고리즘에 대한 인스턴스를 가짐 ● Interface - 각각의 알고리즘이 가져야 할 공통인터페이스 정의 ● Algorithm1,Algorithm2 - 실제 인터페이스 구현. 각각의 알고리즘을 프로그래밍 예제코드 Person_Interface은 전략패턴의 구조 중에 Interface에 해당됩니다. 알고리즘들이 공통적 으로 정의해야 할 인터페이스를 정의합니다. 즉 ..