디자인 패턴 (옵저버, 프록시, 이터레이터, 노출모듈 패턴)
프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록
하나의 '규약' 형태로 만들어 놓은 것을 의미
4. 옵저버 패턴(Observer pattern)이란?
주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
주로 이벤트 기반 시스템에 사용 (ex ) MVC Model-View-Controller )
주체인 모델에서 변경사항이 생겨 update 메서드로 옵저버인 뷰에 알려주고 이를 기반으로 컨트롤러 등이 작동하는 것
import java.util.ArrayList;
import java.util.List;
interface Subject {
public void register(Observer obj);
public void unregister(Observer obj);
public void notifyObservers();
public Object getUpdate(Observer obj);
}
interface Observer {
public void update();
}
class Topic implements Subject {
private List<Observer> observers;
private String message;
public Topic() {
this.observers = new ArrayList<>();
this.message = "";
}
@Override
public void register(Observer obj) {
if (!observers.contains(obj)) observers.add(obj);
}
@Override
public void unregister(Observer obj) {
observers.remove(obj);
}
@Override
public void notifyObservers() {
this.observers.forEach(Observer::update);
}
@Override
public Object getUpdate(Observer obj) {
return this.message;
}
public void postMessage(String msg) {
System.out.println("Message sended to Topic: " + msg);
this.message = msg;
notifyObservers();
}
}
class TopicSubscriber implements Observer {
private String name;
private Subject topic;
public TopicSubscriber(String name, Subject topic) {
this.name = name;
this.topic = topic;
}
@Override
public void update() {
String msg = (String) topic.getUpdate(this);
System.out.println(name + ":: got message >> " + msg);
}
}
public class HelloWorld {
public static void main(String[] args) {
Topic topic = new Topic();
Observer a = new TopicSubscriber("a", topic);
Observer b = new TopicSubscriber("b", topic);
Observer c = new TopicSubscriber("c", topic);
topic.register(a);
topic.register(b);
topic.register(c);
topic.postMessage("amumu is op champion!!");
}
}
/*
[출력]
Message sended to Topic: amumu is op champion!!
a:: got message >> amumu is op champion!!
b:: got message >> amumu is op champion!!
c:: got message >> amumu is op champion!!
*/
* 면접을 위한 CS 전공지식 노트_자바에서의 옵저버 패턴
5. 프록시 패턴(Proxy pattern)이란?
대상 객체에 접근하기 전 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴
객체의 속성, 변환 등을 보완하며 보안, 데이터 검증. 캐싱, 로깅에 사용
프록시 서버
서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킴
장점
프록시 서버에서의 캐싱으로 불필요하게 외부와 연결하지 않기 때문에 트래픽을 줄일 수 있음
* 프록시 서버에서의 캐싱 : 캐시 안에 정보를 담아두고, 캐시 안에 있는 정보를 요구하는 요청에 대해
다시 저 멀리 있는 원격 서버에 요청하지 않고 캐시 안에 있는 데이터를 활용하는 것
6. 이터레이터 패턴(Iterator pattern)이란?
이터레이터(iterator)를 사용하여 컬렉션(collection)의 요소들에 접근하는 디자인 패턴
하나의 인터페이스로 여러 가지 자료형의 구조와 상관없이 순회할 수 있음
7. 노출모듈 패턴(Revealing module pattern)이란?
즉시 실행 함수 (함수를 정의하자마자 바로 호출하는 함수, 함수, 초기화 코드, 라이브러리 내 전역변수의 충돌방지에 사용)를 통해 private, public 같은 접근 제어자를 만드는 패턴
자바스크립트에서의 활용을 보면, a와 b는 private 범위를 가지고 c와 d는 public 범위를 가진다는 것을 알 수 있음
pukuba 함수에서 return 값으로 지정한 public 객체 리터럴만 외부로 노출시킬 수 있음
const pukuba = (() => {
const a = 1
const b = () => 2
const public = {
c : 2,
d : () => 3
}
return public
})()
console.log(pukuba)
console.log(pukuba.a)
// { c: 2, d: [Function: d] }
// undefined
* 면접을 위한 CS 전공지식 노트_자바스크립트에서의 노출 모듈 패턴