본문 바로가기
개발/ETC

디자인 패턴 (2)

by devhooney 2023. 1. 3.
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
Git 커밋 제거하기  (0) 2022.08.02