728x90
1. 전략 패턴
- 전략 패턴은 정책 패턴이라고도 한다.
- 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만든느 패턴
- Java의 전략 패턴 예시
public class HelloWord {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item A = new Item("item1", 100);
Item B = new Item("item2", 200);
cart.addItem(A);
cart.addItem(B);
// pay by A Card
cart.pay(new ACard("test@email.com", "hi");
// pay by B Card
cart.pay(new BCard("test@email.com", "testName", "CardNumber");
}
}
- Item A, B를 카트에 담고 ACard로 결제하거나 BCard로 결제하는데, 여기서 말하는 A, BCard가 전략.
2. 옵저버 패턴
- 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메소드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴.
- 주체는 객체의 상태 변화를 보고 있는 관찰자
- 옵저버들은 이 객체의 상태 변화에 따라 전달되는 메소드 등을 기반으로 추가 변화 사항이 생기는 객체들
- 주체와 객체를 따로 두지 않고 상태가 변경되는 객체를 기반으로 만들기도 한다.
- 옵저버 패턴을 활용한 서비스는 트위터가 있다.
- 옵저버 패턴은 주로 이벤트 기반 시스템에 사용된다.
- Java의 옵저버 패턴 예시
interface Subject {
public void register(Observer obj);
public void notifyObservers();
public void 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 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);
topic.register(a);
topic.register(b);
topic.postMessage("hi~~~");
}
}
// Message sended to Topic : hi~~~
// a: got Message >> hi~~~
// b: got Message >> hi~~~
- topic을 기반으로 옵저버 패턴 구현
- topic은 주체이자 객체
- implements Subject를 통해 Subject interface를 구현
- Observer a = new TopicSubscriber("a", topic);으로 옵저버를 선언할 때 해당 이름과 어떠한 토픽의 옵저버가 될 것인지 정함
728x90
'개발 > ETC' 카테고리의 다른 글
디자인 패턴 (4) (0) | 2023.01.06 |
---|---|
디자인 패턴 (3) (0) | 2023.01.04 |
디자인 패턴 (1) (0) | 2023.01.02 |
공공데이터 API 사용해보기 (0) | 2022.08.25 |
[HTTP] 커넥션 관리 (2) | 2022.08.08 |