{"id":37211,"date":"2023-06-13T22:55:44","date_gmt":"2023-06-13T13:55:44","guid":{"rendered":"https:\/\/m9js.shop\/blog\/?p=37211"},"modified":"2023-06-13T22:55:44","modified_gmt":"2023-06-13T13:55:44","slug":"java-observer-design-pattern-how-to-handle-one-to-many-dependencies-between-objects","status":"publish","type":"post","link":"https:\/\/m9js.shop\/blog\/development\/java-observer-design-pattern-how-to-handle-one-to-many-dependencies-between-objects","title":{"rendered":"\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134: \uac1d\uccb4 \uac04\uc758 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95"},"content":{"rendered":"

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134 \uc18c\uac1c<\/h1>\n

\ub514\uc790\uc778 \ud328\ud134\uc740 \uac1d\uccb4 \uc9c0\ud5a5 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud55c \uc77c\uc885\uc758 \ud15c\ud50c\ub9bf\uc785\ub2c8\ub2e4. \ub514\uc790\uc778 \ud328\ud134\uc740 \ub2e4\uc591\ud55c \uc885\ub958\uac00 \uc788\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uac1d\uccb4 \uac04\uc758 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc744 \ub2e4\ub8e8\ub294 \uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc744 \uc18c\uac1c\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc740 \uac1d\uccb4\uc758 \uc0c1\ud0dc\uac00 \ubcc0\uacbd\ub420 \ub54c, \uc774\ub97c \uad00\ucc30\ud558\uace0\uc790 \ud558\ub294 \uac1d\uccb4\ub4e4\uc5d0\uac8c \uc790\ub3d9\uc73c\ub85c \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \ub514\uc790\uc778 \ud328\ud134\uc785\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 \ud55c \uac1d\uccb4\uac00 \ub2e4\ub978 \uac1d\uccb4\ub4e4\uacfc \uc57d\ud558\uac8c \uacb0\ud569\ub418\uc5b4 \uc788\uace0, \uc11c\ub85c \uac04\uc758 \uc0c1\ud638\uc791\uc6a9\uc774 \ud544\uc694\ud55c \uacbd\uc6b0\uc5d0 \uc720\uc6a9\ud569\ub2c8\ub2e4. \uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc744 \ub2e4\ub8e8\ub294 \ub370 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4.<\/p>\n

\uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc740 MVC(Model-View-Controller) \ud328\ud134\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ubaa8\ub378\uc740 \uc635\uc800\ubc84\uac00 \ub418\uc5b4 \ubdf0\uc640 \ucee8\ud2b8\ub864\ub7ec\uc5d0\uac8c \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uc54c\ub9ac\ub294 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \ubdf0\uc640 \ucee8\ud2b8\ub864\ub7ec\ub294 \uc635\uc800\ubc84 \uc5ed\ud560\uc744 \ud558\uc5ec \ubaa8\ub378\uc758 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uac10\uc9c0\ud558\uace0, \ud654\uba74\uc5d0 \ubcf4\uc5ec\uc8fc\uac70\ub098 \uc0ac\uc6a9\uc790 \uc785\ub825\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n

\"Observer<\/p>\n

\uac1d\uccb4 \uac04 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131 \uc774\ud574\ud558\uae30<\/h2>\n

\uac1d\uccb4 \uac04\uc758 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc740 \ud55c \uac1d\uccb4\uac00 \uc5ec\ub7ec \uac1c\uc758 \uac1d\uccb4\uc5d0\uac8c \uc885\uc18d\ub418\uc5b4 \uc788\ub294 \uc0c1\ud669\uc785\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ud55c \uac1d\uccb4\uac00 \ubcc0\uacbd\ub418\uba74 \ub2e4\ub978 \uc5ec\ub7ec \uac1d\uccb4\ub4e4\ub3c4 \uc774\ub97c \uc54c\uc544\uc57c \ud558\ub294 \uacbd\uc6b0\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7f4 \ub54c, \uc77c\uc77c\uc774 \uac01 \uac1d\uccb4\uc5d0\uac8c \uc54c\ub9ac\ub294 \uac83\uc740 \ubc88\uac70\ub85c\uc6b0\uba70, \uc720\uc9c0\ubcf4\uc218\ub3c4 \uc5b4\ub824\uc6cc\uc9d1\ub2c8\ub2e4.<\/p>\n

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc740 \uc774\ub7ec\ud55c \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uac1d\uccb4 \uac04\uc758 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc744 \ub2e4\ub8f9\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 \ud55c \uac1d\uccb4\uac00 \ubcc0\uacbd\ub418\uba74, \uc774\ub97c \uad00\ucc30\ud558\uace0\uc790 \ud558\ub294 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0\uac8c \uc790\ub3d9\uc73c\ub85c \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uad6c\uc870\ub97c \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574, \uac1d\uccb4 \uac04\uc758 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd9c \uc218 \uc788\uace0, \uc720\uc5f0\uc131\uacfc \ud655\uc7a5\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134 \uad6c\ud604 \ubc29\ubc95<\/h2>\n

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc758 \uad6c\ud604 \ubc29\ubc95\uc740 \ud06c\uac8c \ub450 \uac00\uc9c0\uc785\ub2c8\ub2e4. \uccab \ubc88\uc9f8 \ubc29\ubc95\uc740 \uc790\ubc14 \ub0b4\uc7a5 \uc778\ud130\ud398\uc774\uc2a4\uc778 Observer\uc640 Observable\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ub450 \ubc88\uc9f8 \ubc29\ubc95\uc740 \uc9c1\uc811 \uc635\uc800\ubc84\uc640 \uc11c\ube0c\uc81d\ud2b8\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4.<\/p>\n

Observer\uc640 Observable \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\ud558\uae30<\/h3>\n

\uc790\ubc14\uc5d0\uc11c\ub294 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc704\ud574 \uae30\ubcf8\uc801\uc73c\ub85c Observer\uc640 Observable \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. Observer\ub294 \uad00\ucc30 \ub300\uc0c1 \uac1d\uccb4\uc5d0\uc11c \uc0c1\ud0dc\ub97c \uc54c\ub9ac\ub294 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc785\ub2c8\ub2e4. Observable\uc740 \uad00\ucc30 \ub300\uc0c1 \uac1d\uccb4\uc758 \uc0c1\ud0dc\ub97c \uc54c\ub9ac\ub294 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/p>\n

import java.util.Observable;\nimport java.util.Observer;\n\npublic class WeatherData extends Observable {\n    private float temperature;\n    private float humidity;\n    private float pressure;\n\n    public void measurementsChanged() {\n        setChanged();\n        notifyObservers();\n    }\n\n    public void setMeasurements(float temperature, float humidity, float pressure) {\n        this.temperature = temperature;\n        this.humidity = humidity;\n        this.pressure = pressure;\n        measurementsChanged();\n    }\n\n    public float getTemperature() {\n        return temperature;\n    }\n\n    public float getHumidity() {\n        return humidity;\n    }\n\n    public float getPressure() {\n        return pressure;\n    }\n}\n\npublic class CurrentConditionsDisplay implements Observer {\n    private float temperature;\n    private float humidity;\n\n    public void update(Observable obs, Object arg) {\n        if (obs instanceof WeatherData) {\n            WeatherData weatherData = (WeatherData) obs;\n            this.temperature = weatherData.getTemperature();\n            this.humidity = weatherData.getHumidity();\n            display();\n        }\n    }\n\n    public void display() {\n        System.out.println(\"Current conditions: \" + temperature\n            + \"F degrees and \" + humidity + \"% humidity\");\n    }\n}<\/code><\/pre>\n

\uc9c1\uc811 \uc635\uc800\ubc84\uc640 \uc11c\ube0c\uc81d\ud2b8 \uad6c\ud604\ud558\uae30<\/h3>\n

Observer\uc640 Observable \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0, \uc9c1\uc811 \uc635\uc800\ubc84\uc640 \uc11c\ube0c\uc81d\ud2b8 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

public interface Observer {\n    public void update(float temperature, float humidity, float pressure);\n}\n\npublic interface Subject {\n    public void registerObserver(Observer o);\n    public void removeObserver(Observer o);\n    public void notifyObservers();\n}\n\npublic class WeatherData implements Subject {\n    private ArrayList observers;\n    private float temperature;\n    private float humidity;\n    private float pressure;\n\n    public WeatherData() {\n        observers = new ArrayList();\n    }\n\n    public void registerObserver(Observer o) {\n        observers.add(o);\n    }\n\n    public void removeObserver(Observer o) {\n        int i = observers.indexOf(o);\n        if (i >= 0) {\n            observers.remove(i);\n        }\n    }\n\n    public void notifyObservers() {\n        for (Observer observer : observers) {\n            observer.update(temperature, humidity, pressure);\n        }\n    }\n\n    public void measurementsChanged() {\n        notifyObservers();\n    }\n\n    public void setMeasurements(float temperature, float humidity, float pressure) {\n        this.temperature = temperature;\n        this.humidity = humidity;\n        this.pressure = pressure;\n        measurementsChanged();\n    }\n}\n\npublic class CurrentConditionsDisplay implements Observer {\n    private float temperature;\n    private float humidity;\n    private Subject weatherData;\n\n    public CurrentConditionsDisplay(Subject weatherData) {\n        this.weatherData = weatherData;\n        weatherData.registerObserver(this);\n    }\n\n    public void update(float temperature, float humidity, float pressure) {\n        this.temperature = temperature;\n        this.humidity = humidity;\n        display();\n    }\n\n    public void display() {\n        System.out.println(\"Current conditions: \" + temperature\n            + \"F degrees and \" + humidity + \"% humidity\");\n    }\n}<\/code><\/pre>\n

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc758 \uc7a5\ub2e8\uc810 \ubd84\uc11d<\/h2>\n

\uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc758 \uc7a5\uc810\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n

    \n
  • \uac1d\uccb4 \uac04\uc758 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n
  • \uc720\uc5f0\uc131\uacfc \ud655\uc7a5\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n
  • \uc0c1\ud0dc \ubcc0\uacbd\uc5d0 \ub300\ud55c \uc54c\ub9bc\uc744 \uc790\ub3d9\uc73c\ub85c \ubcf4\ub0b4\ubbc0\ub85c, \uc77c\uc77c\uc774 \uc54c\ub9ac\ub294 \ubc88\uac70\ub85c\uc6c0\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n

    \ud558\uc9c0\ub9cc, \uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc758 \ub2e8\uc810\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

      \n
    • \uad00\ucc30 \ub300\uc0c1 \uac1d\uccb4\uc640 \uc635\uc800\ubc84 \uac1d\uccb4 \uac04\uc758 \uc778\ud130\ud398\uc774\uc2a4 \uc124\uacc4\uac00 \uc798\ubabb\ub420 \uacbd\uc6b0, \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\uac00 \uc99d\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n
    • \uc635\uc800\ubc84 \uac1d\uccb4\uac00 \ub9ce\uc544\uc9c8 \uacbd\uc6b0, \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uc2dc\uac04\uc774 \uc99d\uac00\ud558\uc5ec \uc131\ub2a5 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n

      \uc774\ub7ec\ud55c \ub2e8\uc810\uc744 \uadf9\ubcf5\ud558\uae30 \uc704\ud574\uc11c\ub294, \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc801\uc808\ud558\uac8c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c, \uac1d\uccb4 \uac04\uc758 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc744 \ub2e4\ub8e8\ub294 \uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134\uc740 \uac1d\uccb4 \uc9c0\ud5a5 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ub9e4\uc6b0 \uc720\uc6a9\ud55c \ud328\ud134 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"

      \uc790\ubc14 \uc635\uc800\ubc84 \ub514\uc790\uc778 \ud328\ud134: \uac1d\uccb4 \uac04\uc758 \uc77c\ub300\ub2e4 \uc885\uc18d\uc131\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95<\/p>\n","protected":false},"author":1,"featured_media":12882,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[2105,2446,2698,2188,2584,3291,5925,3414],"class_list":["post-37211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-java","tag-mvc","tag-object","tag-public","tag-system","tag-3291","tag-5925","tag-3414"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/37211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/comments?post=37211"}],"version-history":[{"count":1,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/37211\/revisions"}],"predecessor-version":[{"id":37260,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/37211\/revisions\/37260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media\/12882"}],"wp:attachment":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media?parent=37211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=37211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=37211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}