GoF 디자인패턴 - Observer

Clean Code Big Poo·2025년 6월 3일
0
post-thumbnail

Overview

디자인패턴 시작하기를 보고 정리하기

Observer

관찰자 패턴, 어떤 상태가 변경되었을 때, 이 상태에 관심이 있는 관찰자들에게 알려줌.

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

다이어그램

  • Player : 추상 클래스, 게임에 참여하는 유저
  • OddBettingPlayer : 주사위가 홀수일 때 반응
  • EvenBettinPlayer : 주사위가 짝수일 때 반응
  • DiceGame : 추상 클래스, 주사위의 수를 Player에게 알림
    • 주사위 수 == 상태
    • 여러개의 Player 객체를 가질 수 있음
  • FairDiceGame : DiceGame을 구현함. 1~6까지의 수를 랜덤으로 결정

구현 코드

Player

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;
    }
}

OddBettingPlayer

/// 주사위가 홀수면 "이겼다" 를 출력
public class OddBettingPlayer extends Player{
    public OddBettingPlayer(String name) {
        super(name);
    }

    
    public void update(int diceNumber) {
        if(diceNumber % 2 == 1){
            System.out.println(getName()+" 이겼다. ");
        }
    }
}

EvenBettinPlayer

/// 주사위가 짝수면 "이겼다" 를 출력
public class EvenBettingPlayer extends Player{
    public EvenBettingPlayer(String name) {
        super(name);
    }

    
    public void update(int diceNumber) {
        if(diceNumber % 2 == 0){
            System.out.println(getName()+" 이겼다. ");
        }
    }
}

DiceGame

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();
}

FairDiceGame

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);
        }
    }
}

Main

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();
        }
    }
}

0개의 댓글