
디자인패턴 시작하기를 보고 정리하기
관찰자 패턴, 어떤 상태가 변경되었을 때, 이 상태에 관심이 있는 관찰자들에게 알려줌.

대상에 대해 관심을 가지고 있는 관찰자에게 상태(의 변경)를 알림(notify)

public abstract class Player {
private String name;
public Player(String name) {
this.name = name;
}
public abstract void update(int diceNumber);
public String getName() {
return name;
}
}
/// 주사위가 홀수면 "이겼다" 를 출력
public class OddBettingPlayer extends Player{
public OddBettingPlayer(String name) {
super(name);
}
public void update(int diceNumber) {
if(diceNumber % 2 == 1){
System.out.println(getName()+" 이겼다. ");
}
}
}
/// 주사위가 짝수면 "이겼다" 를 출력
public class EvenBettingPlayer extends Player{
public EvenBettingPlayer(String name) {
super(name);
}
public void update(int diceNumber) {
if(diceNumber % 2 == 0){
System.out.println(getName()+" 이겼다. ");
}
}
}
import java.util.LinkedList;
public abstract class DiceGame {
/// protected: 자식 클래스에서도 접근 가능
protected LinkedList<Player> players = new LinkedList<>();
public void addPlayer(Player player){
players.add(player);
}
public abstract void play();
}
import java.util.Iterator;
import java.util.Random;
public class FairDaceGame extends DiceGame{
private Random random = new Random();
public void play() {
int diceNumber = random.nextInt(6) + 1;
System.out.println("-주사위 굴림- : "+diceNumber);
Iterator<Player> iter = players.iterator();
while (iter.hasNext()){
iter.next().update(diceNumber);
}
}
}
import java.util.ArrayList;
public class Main {
public static void main(String[] args){
DiceGame diceGame = new FairDaceGame();
Player p1 = new EvenBettingPlayer("킴");
Player p2 = new EvenBettingPlayer("퐉");
Player p3 = new OddBettingPlayer("리");
diceGame.addPlayer(p1);
diceGame.addPlayer(p2);
diceGame.addPlayer(p3);
for(int i=0; i<5;i++){
diceGame.play();
System.out.println();
}
}
}