본문 바로가기
🥝CS

[ComputerScience]디자인패턴 // 전략패턴과 옵저버패턴

by 김말자 2022. 8. 10.
728x90
728x90
BIG

전략패턴(strategy pattern)

정책패턴(policy parttern)이라고도 함

객체의 행위를 바꾸고 싶은 경우 직접수정하지 않고 캡슐화해서 컨텍스트 안에서 바꿔주어 상호 교체가 가능하게 만드는 패턴

*컨택스트(context) = 상황, 맥락, 문맥, 개발자가 작업완료시 필요한 관련된 모든정보를 말함

특정한 계열의 알고리즘들을 정의해서 그걸 캡슐화해서 계열안에서 상호교체가 가능하게 만듬

유연하고 재사용가능하게 객체 지향 소프트웨어를 설계하기위해 만들어짐

 

대표적인 예시가 passport

http://www.passportjs.org/

 

Passport.js

Simple, unobtrusive authentication for Node.js

www.passportjs.org

 

 

옵저버패턴(observer pattern)

  • 옵저버 or 리스너 - 객체의 상태변화를 관찰하는 관찰자들을 말함(이벤트를 관찰하는 대상)
  • 옵저버패턴 - 옵저버들의 목록을 객체에 등록해 상태변화가 있을때마다 메서드 등을 통해 객체가 옵저버들한테 통지하도록 하는 디자인 패턴
  • 분산이벤트 핸들링시스템구현시 많이 사용
  • 발행/구독 모델로 알려져있기도함
  • mvc패턴에 많이 사용함
  • 예시로는 트위터가 있음

코코도르 디퓨저 200ml x 2p, 에이프릴 프레쉬Apple 2022 맥북 에어, 스타라이트, M2 8코어, GPU 8코어, 256GB, 8GB, 30W, 영문라온 LG그램 맥북 노트북 슬리브파우치, 오트밀카키노트북파우치 맥북가방 13인치 15인치 17인치퍼니메이드 캔버스 노트북 파우치 + 가죽 마우스패드, 인디블루(파우치)로마네 브런치브라더 바게트베어 EVA 하드 노트북 파우치 13형끼움 맥북 노트북 슬림 가죽 슬리브 포트폴리오 파우치, 스카이블루

 

실행방식

  1. 옵저버라는 하나 이상의 객체가 관찰 대상이 되는 객체에 등록시킴
  2. 옵저버들이 객체가 발생시키는 이벤트를 받아 처리(콜백)
  3. 파생 옵저버들이 notify함수를 구현해 이벤트가 발생할때 각자의 동작들을 정의해야함
  4. 계속 등록, 제거가 반복되므로 이벤트에서 순환 실행을 막는 메커니즘을 꼭 필요함

 

/* 파일명 : EventSource.java */

package obs;
import java.util.Observable; // 이 부분이 옵저버에게 신호를 보내는 주체입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class EventSource extends Observable implements Runnable
{
    public void run()
    {
        try
        {
            final InputStreamReader isr = new InputStreamReader( System.in );
            final BufferedReader br = new BufferedReader( isr );
            while( true )
            {
                final String response = br.readLine();
                setChanged();
                notifyObservers( response );
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

 

/* 파일명: ResponseHandler.java */

package obs;

import java.util.Observable;
import java.util.Observer; /* 여기가 옵저버 */

public class ResponseHandler implements Observer
{
    private String resp;
    public void update (Observable obj, Object arg)
    {
        if (arg instanceof String)
        {
            resp = (String) arg;
            System.out.println("\nReceived Response: "+ resp );
        }
    }
}
/* 파일명 : myapp.java */
/* 여기서부터가 프로그램 시작점 */

package obs;

public class MyApp
{
    public static void main(String args[])
    {
        System.out.println("Enter Text >");

        // 이벤트 발행 주체를 생성함 - stdin으로부터 문자열을 입력받음
        final EventSource evSrc = new EventSource();

        // 옵저버를 생성함
        final ResponseHandler respHandler = new ResponseHandler();

        // 옵저버가 발행 주체가 발행하는 이벤트를 구독하게 함
        evSrc.addObserver( respHandler );

        // 이벤트를 발행시키는 쓰레드 시작
        Thread thread = new Thread(evSrc);
        thread.start();
    }
}

 

이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

728x90
반응형
BIG

댓글