[GoF] Observer 패턴

패턴명칭

Observer

필요한 상황

상태가 변경되면 그 상태 변경에 따라 반응하는 구조를 구현하기 위한 패턴이다.

예제 코드

주사위 게임을 예제로 한다. DicePlay는 주사위를 던지는 기능을 실행한다. Player는 주사위 게임에 참여하는 사람들이다. Player를 상속받는 OddBettingPlayer는 홀수에 배팅을 거는 사람이고, EvenBettingPlayer는 짝수에 배팅을 거는 사람이다. 주사위 게임에 참여하면, 주사위가 던져질때 자동으로 게임에 참여한 사람들의 승리 여부를 즉시 확인이 가능하다. DicePlay 클래스는 다음과 같다.

package tstThread;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;

public class DicePlay {
	private LinkedList<Player> players = new LinkedList<Player>();
	private Random random = new Random();
	
	public void addPlayer(Player player) {
		players.add(player);
	}
	
	public void play() {
		int v = random.nextInt(6) + 1;
		
		System.out.println("Dice Number: " + v);
		
		Iterator<Player> iter = players.iterator();
		while(iter.hasNext()) {
			iter.next().update(v);
		}
	}
}

Player의 코드는 다음과 같다.

package tstThread;

public abstract class Player {
	private String name;
	
	public Player(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public abstract void update(int n);
}

Player를 상속받는 OddBettingPlayer 클래스는 다음과 같다.

package tstThread;

public class OddBettingPlayer extends Player {

	public OddBettingPlayer(String name) {
		super(name);
	}

	@Override
	public void update(int n) {
		if(n % 2 == 1) {
			System.out.println(getName() + " win!");
		}
	}
}

Player를 상속받는 EvenBettingPlayer 클래스는 다음과 같다.

package tstThread;

public class EvenBettingPlayer extends Player {

	public EvenBettingPlayer(String name) {
		super(name);
	}

	@Override
	public void update(int n) {
		if(n % 2 == 0) {
			System.out.println(getName() + " win!");
		}
	}
}

위의 클래스를 사용한 예제 코드는 다음과 같다.

package tstThread;

public class Main {
	public static void main(String[] args) {
		DicePlay dicePlay = new DicePlay();
		
		Player player1 = new EvenBettingPlayer("Jane");
		Player player2 = new OddBettingPlayer("Suji");
		
		dicePlay.addPlayer(player1);
		dicePlay.addPlayer(player2);
		
		for(int i=0; i<10; i++) {
			dicePlay.play();
			System.out.println();
		}		
	}
}

실행결과는 다음과 같다.

Dice Number: 6
Jane win!

Dice Number: 1
Suji win!

Dice Number: 5
Suji win!

Dice Number: 6
Jane win!

Dice Number: 6
Jane win!

Dice Number: 5
Suji win!

Dice Number: 2
Jane win!

Dice Number: 5
Suji win!

Dice Number: 3
Suji win!

Dice Number: 2
Jane win!
이 글은 소프트웨어 설계의 기반이 되는 GoF의 디자인패턴에 대한 강의자료입니다. 완전한 실습을 위해 이 글에서 소개하는 클래스 다이어그램과 예제 코드는 완전하게 실행되도록 제공되지만, 상대적으로 예제 코드와 관련된 설명이 함축적으로 제공되고 있습니다. 이 글에 대해 궁금한 점이 있으면 댓글을 통해 남겨주시기 바랍니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다