[OOP] 5️⃣ | GoF 디자인 패턴 2

WONNY_LOG·2023년 4월 17일
0

2. 구조 패턴

컴포지트(Composite) 패턴

사용자로 하여금 개별 객체와 복합객체를 모두 동일하게 다룰 수 있도록 한다부분과 전체의 계층을 표현하기 위해 객체들을 모아 트리 구조로 구성한다

데코레이터(Decorator)

상황에 따라 어떤 객체에 책임을 덧붙이는 패턴

  • 객체에 새로운 행동을 추가하는 가장 효과적인 방법
  • 객체의 기존 인터페이스 동작을 향상하거나 수정하는것이 아닌, 새로운 기능으로 기능을 추가시킨다
  • 기능 확장을 위해 서브 클래스에 대한 유연한 대안을 제공한다
  • 선물 포장, 상자에 넣고 상자를 포장하는 것과 비슷

✔️ 자바스크립트 로직 구현

function () {
    this.cost = function () { return 997; };
    this.screenSize = function () { return 13.3; };
}
/*Decorator 1*/
function Memory(macbook) {
    var v = macbook.cost();
    macbook.cost = function() {
        return v + 75;
    }
}
 /*Decorator 2*/
function Engraving( macbook ){
   var v = macbook.cost();
   macbook.cost = function(){
     return  v + 200;
  };
}

/*Decorator 3*/
function Insurance( macbook ){
   var v = macbook.cost();
   macbook.cost = function(){
     return  v + 250;
  };
}
var mb = new MacBook();
Memory(mb);
Engraving(mb);
Insurance(mb);
console.log(mb.cost()); //1522
console.log(mb.screenSize()); //13.3  //동일한 클래스의 모든 객체에 추가되지 않는다

퍼사드(Facade) 패턴

복잡하게 얽힌 클래스를 개별적으로 제어하는 것이 아니라 창구 역학을 하는 클래스를 하나 배치해서 시스텐 전체의 조작성을 좋게 한다

어댑터(Adapter) 패턴

클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 적응시킨다.서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시킨다.

브리지(Bridge) 패턴

구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 한다

플라이웨이트(Flyweight) 패턴

공유를 통해 많은 수의 소립 객체들을 효과적으로 지원한다

프록시(Proxy) 패턴

다른 객체에 대한 접근을 제어하기 위한 대리자 또는 자리채움자 역할을 하는 객체를 둔다

3. 행위 패턴

옵서버(Observer) 패턴

상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 사용한다

  • 객체 상태가 변할 때 관련 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 함
  • Model-View-Controller의 "View" 부분이다
  • Subject, Observer 를 선언합니다> Subject : 변경과 감지를 통보하여 Observer들을 관리하는 역할 (핵심추상화)> Observer : 변경과 감지를 통보받는 역할 (변수추상화)
  var Subject = function() {
    var observers = [];

    return {
        subscribeObserver: function(observer) {
            observers.push(observer);
        },
        unsubscribeObserver: function(observer) {
            var index = observers.indexOf(observer);
            if(index > -1) {
                observers.splice(index, 1);
            }
        },
        notifyObserver: function(observer) {
            var index = observers.indexOf(observer);
            if(index > -1) {
                observers[index].notify(index);
            }
        },
        notifyAllObservers: function() {
            for(var i = 0; i < this.observers.length; i++){
                observers[i].notify(i);
            };
        }
    }
}
var Observer = function() {
    return {
        notify: function(index) {
            console.log("Observer " + index + " is notified!");
        }
    }
}

사용하기

// Subject 객체 생성
var subject = new Subject();

// Observer 객체 생성
var observer1 = new Observer();
var observer2 = new Observer();
var observer3 = new Observer();
var observer4 = new Observer();

// Subject 객체 생성
subject.subscribeObserver(observer1);
subject.subscribeObserver(observer2);
subject.subscribeObserver(observer3);
subject.subscribeObserver(observer4);

// Observer 2번에 통보
subject.notifyObserver(observer2);

// Observer 전체에 통보
subject.notifyAllObservers();

Observer는 한 개체의 상태가 변경되면 다른 개체에 자동으로 통지되고 업데이트되도록 일대다 관계를 정의한다.경매는 이 패턴을 보여준다. 각 입찰자는 입찰 표시에 사용되는 번호의 패들을 가지고 있다. 경매인은 입찰에 착수하고, 입찰에 응하기 위해 번호패를 들어올리면 "observes"한다. 입찰의 수락은 신규 입찰 형식으로 모든 입찰자에게 브로드캐스트되는 입찰 가격을 변경한다.

책임 연쇄(Chain of Responsibility) 패턴

요청을 받는 객체를 연쇄적으로 묶어 요청을 처리하는 객체를 만날 때까지 객체 Chain을 따라 요청을 전달함

커맨드(Command) 패턴

요청을 객체의 형태로 캡슐화하여 재사용하거나 취소할 수 있도록 저장함

인터프리터(Interpreter) 패턴

특정 언어의 문법 표현을 정의함

반복자(Iterator) 패턴

내부를 노출하지 않고 접근이 잦은 어떤 객체의 원소를 순차적으로 접근할 수 있는 동일한 인터페이스 제공

중재자(Mediator) 패턴

한 집합에 속해있는 객체들의 상호작용을 캡슐화하여 새로운 객체로 정의

메멘토(Memento) 패턴

객체가 특정 상태로 다시 되돌아올 수 있도록 내부 상태를 실체화

상태(State) 패턴

객체의 상태에 따라 동일한 동작을 다르게 처리해야할 때 사용

전략(Strategy) 패턴

동일 계열의 알고리즘군을 정의하고 캡슐화하여 상호교환이 가능하도록 함

템플릿 메소드(Template Method) 패턴

상위클래스는 알고리즘의 골격만을 작성하고 구체적인 처리는 서브클래스로 위임함

방문자(Visitor) 패턴

객체의 원소에 대해 수행할 연산을 분리하여 별도의 클래스로 구성함

0개의 댓글