디자인 패턴 ~Observer~
13061 단어 객체 지향디자인 패턴신인 프로그래머 응원uml자바
1. 소개
GoF의 디자인 패턴에서 Observer 패턴을 요약합니다.
2. Observer 패턴이란?
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
7. 디자인 패턴 목록
8. 참고
이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.
Reference
이 문제에 관하여(디자인 패턴 ~Observer~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/i-tanaka730/items/b69cd773d81e044a2ec9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)