๐ŸŒป JAVA/๋””์ž์ธ ํŒจํ„ด

2. ์˜ต์ €๋ฒ„(Observer) ํŒจํ„ด - Head First Design Patterns

2020. 4. 4. 14:17
๋ฐ˜์‘ํ˜•

* ์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ์‹ ๋ฌธ์‚ฌ ๊ตฌ๋… ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๊ฐ™๋‹ค๊ณ  ํ• ์ˆ˜ ์žˆ๋‹ค.

  ์ถœํŒ์‚ฌ๋ฅผ ์ฃผ์ œ(Subject) , ๊ตฌ๋…์ž๋ฅผ ์˜ต์ €๋ฒ„(Observer) ๋ผ๊ณ  ์ •ํ•ด๋ณด์ž.

 

 

์˜ต์ €๋ฒ„ ํŒจํ„ด์˜ ๊ฐ„๋‹จํ•œ ๊ทธ๋ฆผ ์„ค๋ช…

์˜ต์ €๋ฒ„๋Š” ๋“ฑ๋ก(register) , ์ œ๊ฑฐ(remove) ๊ฐ€ ์ž์œ ๋กญ๋‹ค.

 

 

์˜ต์ €๋ฒ„ ํŒจํ„ด ์ •์˜ ) ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ทธ ๊ฐ์ฒด์˜ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“คํ•œํ…Œ ์—ฐ๋ฝ์ด ๊ฐ€๊ณ ,

์ž๋™์œผ๋กœ ๋‚ด์šฉ์ด ๊ฐฑ์‹ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ๋Œ€๋‹ค ์˜์กด์„ฑ์„ ์ •์˜ํ•œ๋‹ค.

 

 

 

์˜ต์ €๋ฒ„ ํŒจํ„ด : ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

์˜ต์ €๋ฒ„์— ๋Œ€ํ•œ ๋ชจ๋“  ์ œ์–ด ( ๋“ฑ๋ก(register) , ์ œ๊ฑฐ(remove) , ์•Œ๋ฆผ(notify) ) ๋Š”  Subject์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

 

๋””์ž์ธ ์›์น™ ) ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š” ๊ฐ์ฒด ์‚ฌ์ด์—์„œ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด *๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋Š” ๋””์ž์ธ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

* ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒจ๋„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ• ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ƒํ˜ธ์˜์กด์„ฑ์„ ์ตœ์†Œํ™” ํ• ์ˆ˜ ์žˆ๋‹ค. (์ค‘์š”)

 

 

 

๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜ :  ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

 

๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜ ์ฝ”๋“œ๋“ค์„ ์‚ดํŽด๋ณด์ž. 

//WeatherData.java

import java.util.*;

public class WeatherData implements Subject {
	private ArrayList<Observer> observers;	//์˜ต์ €๋ฒ„๋“ค์„ ๋‹ด์„ list
	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData() {
		observers = new ArrayList<Observer>(); //list ์ƒ์„ฑ
	}
	
	public void registerObserver(Observer o) { // ์˜ต์ €๋ฒ„ ๋“ฑ๋ก
		observers.add(o);
	}
	
	public void removeObserver(Observer o) { // ์˜ต์ €๋ฒ„ ์ œ๊ฑฐ
		int i = observers.indexOf(o);
		if (i >= 0) {
			observers.remove(i);
		}
	}
	
	public void notifyObservers() { // ์ตœ์ข…์ ์œผ๋กœ ์˜ต์ €๋ฒ„์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๋ถ€๋ถ„!
		for (Observer observer : observers) {
			observer.update(temperature, humidity, pressure);
		}
	}
	
    /* ์™œ ๋ฐ”๋กœ notifyObservers()๋ฅผ ํ˜ธ์ถœ ํ•˜์ง€ ์•Š๊ณ  ์ด๋ ‡๊ฒŒ ํ–ˆ์„๊นŒ?*/
	public void measurementsChanged() {
		notifyObservers();
	}
	
    /*  ** ์ฒซ๋ฒˆ์งธ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ **
       main๋ฌธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ. 
       ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์— ๊ฐ๊ฐ ์ €์žฅ์„ ํ•œ๋’ค์—,
       measurementsChanged() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ.
    */
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

	public float getTemperature() {
		return temperature;
	}
	
	public float getHumidity() {
		return humidity;
	}
	
	public float getPressure() {
		return pressure;
	}

}
// CurrentConditionsDisplay.java

public class CurrentConditionsDisplay implements Observer, DisplayElement {
	private float temperature;
	private float humidity;
	private Subject weatherData; // Subject ๊ฐ์ฒด ๊ตฌ์„ฑ
	
	public CurrentConditionsDisplay(Subject weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this); //ํ˜„์žฌ ํด๋ž˜์Šค๋ฅผ ์˜ต์ €๋ฒ„์— ๋“ฑ๋ก
	}
	
    /* ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„!!
    	์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•œ ์ด์œ . ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ.
        Subject ๊ฐ์ฒด์—์„œ weatherData ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌ๋…ํ•œ ํด๋ž˜์Šค๋“ค์—๊ฒŒ
        ์•Œ๋ฆผ์„ ๋Œ๋ฆฐ๋‹ค.
	*/
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		display();
	}
	
	public void display() {
		System.out.println("Current conditions: " + temperature 
			+ "F degrees and " + humidity + "% humidity");
	}
}
//main.java

WeatherData weatherData = new WeatherData();

CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay( weatherData );

weatherData.setMeasurements( 80, 65, 30.4f );
weatherData.setMeasurements( 82, 70, 29.2f );
weatherData.setMeasurements( 78, 90, 33.5f );

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ ์ถœ๋ ฅ ๋˜๋Š” ๋ถ€๋ถ„์€ ๊ฐ Displayํด๋ž˜์Šค๋“ค์˜ display() ๋ฉ”์†Œ๋“œ ์ด๋‹ค.

์ถœ๋ ฅ)

Current conditions : 80.0F degrees and 65.0% humidity

Current conditions : 82.0F degrees and 70.0% humidity

Current conditions : 78.0F degrees and 90.0% humidity

 


 

์ž๋ฐ” ๋‚ด์žฅ ์˜ต์ €๋ฒ„ ํŒจํ„ด ์‚ฌ์šฉํ•˜๊ธฐ (Observable)

 

 

import java.util.Observable; //๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ Observer/Observable์„ ๋ถˆ๋Ÿฌ์™€์•ผํ•œ๋‹ค.
import java.util.Observer;
	
    //์ด๋ฒˆ์—๋Š” Observable์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.
public class WeatherData extends Observable { //Observable์„ interface๊ฐ€ ์•„๋‹˜!!!!
	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData() { }
	
	public void measurementsChanged() {
		setChanged();  // ** ์ค‘์š”ํ•œ ๋ถ€๋ถ„
		notifyObservers();
	}
	
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
	
	public float getTemperature() {
		return temperature;
	}
	
	public float getHumidity() {
		return humidity;
	}
	
	public float getPressure() {
		return pressure;
	}
}

๋‚ด์žฅ Observable/Observer ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์˜ต์ €๋ฒ„๋“ค์„ ์ง์ ‘ ๋“ฑ๋ก/์ œ๊ฑฐ ๋“ฑ์„ ๊ด€๋ฆฌ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

(์Šˆํผ ํด๋ž˜์Šค์—์„œ ์•Œ์•„์„œ ๋‹ค ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—..)

 

๋ฐ”๋€ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด์ž. setChanged();

//setChanged()

setChanged(){
	changed = true; // 1. ๋จผ์ € changed ํ”Œ๋ž˜๊ทธ ๊ฐ’์„ ์ฐธ์œผ๋กœ ์„ค์ •.
}

notifyObservers(Object arg){
	if( changed ) { 	// 2. flag๊ฐ€ ์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ ์—ฐ๋ฝ์„ ๋Œ๋ฆฐ๋‹ค.
    	//๋ชฉ๋ก์— ์žˆ๋Š” ๋ชจ๋“  ์˜ต์ €๋ฒ„๋“ค์—๊ฒŒ{
        	update(this, arg);
            }
       changed = false;
 }
 
 notifyObservers(){
 	notifyObservers(null);
 }

* ์–ธ์ œ ์‚ฌ์šฉ์ด ๋˜๋Š”๊ฐ€?  ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜์— ์žˆ๋Š” ์˜จ๋„ ์„ผ์„œ๊ฐ€ ์›Œ๋‚™ ๋ฏผ๊ฐํ•ด์„œ 0.1 ๋„ ๋‹จ์œ„๋กœ ์‰ด ์ƒˆ์—†์ด ๋ฐ”๋€๋‹ค๊ณ  ํ•ด๋ณด๋ฉด, ์˜ต์ €๋ฒ„๋“ค์—๊ฒŒ ์ˆ˜์‹œ๋กœ ์—ฐ๋ฝ์„ ๋Œ๋ ค์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•„์š”์— ๋”ฐ๋ผ 0.5๋„ ์ด์ƒ ๋ฐ”๋€Œ์—ˆ์„๋•Œ๋งŒ ์—ฐ๋ฝ์„ ๋Œ๋ฆฌ๊ณ  ์‹ถ์„๋–„๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ ๋‹นํ• ๊ฑฐ ๊ฐ™๋‹ค.

 

 

java.util.Observable์˜ ๋‹จ์ 

 

Observable API๋ฅผ ์‚ดํŽด ๋ณด๋ฉด setChanged() ๋ฉ”์†Œ๋“œ๊ฐ€ protected๋กœ ์„ ์–ธ ๋˜์žˆ๋‹ค.

์ž๋ฐ” ๋‚ด์žฅ Observable์€  ํ—ค๋“œํผ์ŠคํŠธ ๋””์ž์ธ ํŒจํ„ด์„ ์ฝ์–ด ๋ณด๋ฉด ๋ฌธ์ œ์ ์„ ์ง€์ ํ•˜๊ณ  ์žˆ๋‹ค.

 

Observable์€ ํด๋ž˜์Šค์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ Observable์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค. ์ด๋•Œ ์žฌ์‚ฌ์šฉ์„ฑ์— ์ œ์•ฝ์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ธ๋ฐ ์ด๊ฒƒ์— ์ œ์•ฝ์ด ์ƒ๊ธด๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ setChanged()๋ฉ”์†Œ๋“œ๋Š” protected๋กœ ์„ ์–ธ ๋˜์–ด ์žˆ์–ด์„œ Observable์˜ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ๋งŒ ํ˜ธ์ถœํ• ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๋””์ž์ธ์€ ์ƒ์†๋ณด๋‹ค๋Š” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋””์ž์ธ ์›์น™์—์„œ๋„ ์œ„๋ฐฐ๊ฐ€ ๋œ๋‹ค. 

๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐ŸŒป JAVA/๋””์ž์ธ ํŒจํ„ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • 5. ์‹ฑ๊ธ€ํ„ด (Singleton) ํŒจํ„ด - Head First Design Patterns
  • 4. ํŒฉํ† ๋ฆฌ(Factory) ํŒจํ„ด - Head First Design Patterns
  • 3. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorator) ํŒจํ„ด - Head First Design Patterns
  • 1. ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€(Strategy) ํŒจํ„ด - Head First Design Patterns
iseunghan
iseunghan
๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan
iseunghan

๊ณต์ง€์‚ฌํ•ญ

  • ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜์ด ๋˜๊ธฐ ์œ„ํ•ด ๐Ÿ”ฅ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (261)
    • ๐Ÿ’ Spring (14)
      • ๊ฐœ๋… ๋ฐ ์ดํ•ด (2)
      • Spring ํ•ต์‹ฌ ๊ธฐ์ˆ  (24)
      • Spring REST API (8)
      • Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  (7)
      • Spring Security (23)
      • Spring in Action (1)
    • ๐ŸŒป JAVA (84)
      • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ (13)
      • ๋””์ž์ธ ํŒจํ„ด (7)
      • ์ •๋ฆฌ์ •๋ฆฌ์ •๋ฆฌ (43)
      • JUnit (1)
    • ๐Ÿ”– Snippets (3)
      • Javascript (3)
    • โš™๏ธ Devops (22)
      • โ› Git (11)
      • ๐Ÿณ Docker (6)
      • ๐Ÿง Linux (3)
      • ๐ŸŒˆ Jenkins (1)
      • ๐Ÿ“ฌ Kafka (1)
    • ๐Ÿ’ฌ ETC.. (4)
      • ๐Ÿ’ป macOS (2)
    • ๐ŸŒง๏ธ ORM (2)
      • JPA (2)
    • ๐Ÿ Python (2)
    • ๐Ÿ“š Databases (15)
      • ์˜ค๋ผํด๋กœ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ก ๊ณผ ์‹ค์Šต(2ํŒ) (3)
      • RealMySQL 8.0 (8)
    • ๐Ÿ”ฅ Computer Science (5)
      • ๐Ÿ“ก ๋„คํŠธ์›Œํฌ (5)
    • ๐Ÿท๏ธ ํ˜‘์—… (1)
    • ๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (38)
      • BAEKJOON\์ˆ˜ํ•™ 1, ์ˆ˜ํ•™ 2 (8)
      • BAEKJOON\์žฌ๊ท€ (5)
      • BAEKJOON\๋ธŒ๋ฃจํŠธ ํฌ์Šค (3)
      • BAEKJOON\์ •๋ ฌ (1)
      • BAEKJOON\๋ฐฑํŠธ๋ž˜ํ‚น (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\์ด๋ถ„ํƒ์ƒ‰ (1)
      • BAEKJOON\๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (9)
      • BAEKJOON\๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
    • โœจ ISEUNGHAN (1)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
๋ฐ˜์‘ํ˜•
hELLO ยท Designed By ์ •์ƒ์šฐ.
iseunghan
2. ์˜ต์ €๋ฒ„(Observer) ํŒจํ„ด - Head First Design Patterns
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.