디자인 패턴 ~Observer~

1. 소개



GoF의 디자인 패턴에서 Observer 패턴을 요약합니다.

2. Observer 패턴이란?


  • Observer라는 영어 단어는 관찰자라는 의미입니다.
  • Observer 패턴은, 관찰 대상의 상태가 변화하면, 관찰자에게 통지가 행해지는 방식입니다.
  • Observer 패턴은 상태 변화에 따른 처리를 기술할 때 유효합니다.
  • GoF 디자인 패턴은 동작에 대한 디자인 패턴으로 분류됩니다.

  • 3. 샘플 클래스 다이어그램





    4. 샘플 프로그램



    무작위로 숫자를 생성하고 그 변화에 따라 "숫자"및 "*"를 표시하는 프로그램입니다.

    4-1. Observer 인터페이스



    관찰자를 나타내는 인터페이스입니다.

    Observer.java
    public interface Observer {
        public abstract void update(NumberGenerator generator);
    }
    

    4-2. DigitObserver 클래스



    숫자로 숫자를 나타내는 클래스입니다. Observer 인터페이스를 구현합니다.

    DigitObserver.java
    public class DigitObserver implements Observer {
    
        public void update(NumberGenerator generator) {
            System.out.println("DigitObserver:" + generator.getNumber());
        }
    }
    

    4-3. GraphObserver 클래스



    간단한 그래프로 숫자를 나타내는 클래스입니다. Observer 인터페이스를 구현합니다.

    GraphObserver.java
    public class GraphObserver implements Observer {
    
        public void update(NumberGenerator generator) {
            System.out.print("GraphObserver:");
            int count = generator.getNumber();
            for (int i = 0; i < count; i++) {
                System.out.print("*");
            }
            System.out.println("");
        }
    }
    

    4-4. NumberGenerator 클래스



    숫자를 생성하는 객체를 나타내는 추상 클래스입니다.

    NumberGenerator.java
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public abstract class NumberGenerator {
    
        private ArrayList<Observer> observers = new ArrayList<Observer>();
    
        public void addObserver(Observer observer) {
            observers.add(observer);
        }
    
        public void deleteObserver(Observer observer) {
            observers.remove(observer);
        }
    
        public void notifyObservers() {
            Iterator it = observers.iterator();
            while (it.hasNext()) {
                Observer o = (Observer) it.next();
                o.update(this);
            }
        }
    
        public abstract int getNumber();
        public abstract void execute();
    }
    

    4-5. RandomNumberGenerator 클래스



    무작위로 숫자를 생성하는 클래스입니다.

    RandomNumberGenerator.java
    import java.util.Random;
    
    public class RandomNumberGenerator extends NumberGenerator {
    
        private Random random = new Random();
        private int number;
    
        public int getNumber() {
            return number;
        }
    
        public void execute() {
            for (int i = 0; i < 10; i++) {
                number = random.nextInt(50);
                notifyObservers();
            }
        }
    }
    

    4-6. Main 클래스



    메인 처리를 실시하는 클래스입니다.

    Main.java
    public class Main {
        public static void main(String[] args) {
    
            NumberGenerator generator = new RandomNumberGenerator();
            Observer observer1 = new DigitObserver();
            Observer observer2 = new GraphObserver();
            generator.addObserver(observer1);
            generator.addObserver(observer2);
            generator.execute();
        }
    }
    

    4-7. 실행 결과


    DigitObserver:35
    GraphObserver:***********************************
    DigitObserver:33
    GraphObserver:*********************************
    DigitObserver:40
    GraphObserver:****************************************
    DigitObserver:28
    GraphObserver:****************************
    DigitObserver:4
    GraphObserver:****
    DigitObserver:45
    GraphObserver:*********************************************
    DigitObserver:7
    GraphObserver:*******
    DigitObserver:30
    GraphObserver:******************************
    DigitObserver:31
    GraphObserver:*******************************
    DigitObserver:22
    GraphObserver:**********************
    

    5. 장점



    Observer 패턴에서는, 상태를 가지고 있는 RandomNumberGenerator 클래스와, 상태 변화를 통지받는 DigitObserver 클래스, GraphObserver 클래스가 등장합니다. 그리고 그 2개의 역할을 연결하고 있는 것이, Observer 인터페이스와 NumberGenerator 클래스가 됩니다.
    RandomNumberGenerator 클래스는, 자신이 현재 감시하고 있는 것이, DigitObserver 인스턴스인가, GraphObserver 인스턴스인지를 모릅니다. 그러나 observers 필드에 저장된 인스턴스가 Observer 인터페이스를 상속한다는 것을 알고 있으며 update 메서드를 호출할 수 있습니다.
    한편, DigitObserver 클래스, GraphObserver 클래스는, 자신을 관찰하고 있는 것이 RandomNumberGenerator 인스턴스인지, 다른 XXXNumberGenerator 인스턴스인지는 모릅니다. 다만, NumberGenerator 의 서브 클래스의 인스턴스이며, getNumber 메소드를 가지고 있는 것은 알고 있습니다.
    - 추상 클래스와 인터페이스를 사용하여 구체적인 클래스에서 추상 메서드를 뽑습니다.
    - 인수로 인스턴스를 전달하거나 필드에서 인스턴스를 유지할 때 추상 클래스와 인터페이스 유형으로 유지
    이렇게 하면 구상 클래스의 부분을 딸깍하는 것으로 교환할 수 있습니다.

    6. GitHub


  • htps : // 기주 b. 코 m / 이타나카 730 /

  • 7. 디자인 패턴 목록


  • GoF 디자인 패턴 요약

  • 8. 참고



    이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
  • Java 언어로 배우는 디자인 패턴 입문

  • 매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
    디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.

    좋은 웹페이지 즐겨찾기