{"id":10541,"date":"2020-10-12T12:26:35","date_gmt":"2020-10-12T03:26:35","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10541"},"modified":"2020-10-25T09:22:18","modified_gmt":"2020-10-25T00:22:18","slug":"mediator-%ed%8c%a8%ed%84%b4","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10541","title":{"rendered":"[GoF] Mediator \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134\uba85\uce6d<\/h4>\n<p>Mediator<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669<\/h4>\n<p>\uac1d\uccb4\ub4e4 \uac04\uc758 \uc0c1\ud0dc\uac00 \ub610 \ub2e4\ub978 \uac1d\uccb4\uc758 \uc0c1\ud0dc \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \uc904\ub54c \uac01 \uac1d\uccb4\uc758 \uc0c1\ud0dc \ubcc0\ud654\ub97c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc77d\uc5b4 \ucc98\ub9ac\ud558\uae30 \ubcf4\ub2e4 \ud558\ub098\uc758 \uc911\uac1c\uc790(Mediator)\ub97c \ub450\uc5b4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. <\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc<\/h4>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/mediator.png\" alt=\"\" width=\"900\" class=\"aligncenter size-full wp-image-10542\" \/><\/p>\n<p>\ub0a0\uc528 \uc815\ubcf4\uc5d0 \ub530\ub77c \uc9d1\uc548\uc758 \ubb38, \ucc3d, \uc5d0\uc5b4\ucee8, \ubcf4\uc77c\ub7ec\uc758 \uac00\ub3d9\uc744 \uc790\ub3d9\ud654\ud558\ub294 \uc608\uc81c\uc774\ub2e4. \ube44\uac00 \uc624\uba74 \ucc3d\uc744 \ub2eb\uace0 \uc628\ub3c4\uac00 0\ub3c4 \ubcf4\ub2e4 \ub5a8\uc5b4\uc9c0\uba74 \ubcf4\uc77c\ub7ec\ub97c \ucf1c\uace0 \uc5d0\uc774\ucee8\uc744 \ub048\ub2e4. \uadf8\ub9ac\uace0 \uc628\ub3c4\uac00 30\uac00 \ub118\uc5b4\uac00\uba74 \uc5d0\uc5b4\ucee8\uc744 \ucf1c\uace0 \ubcf4\uc77c\ub7ec\ub97c \ub048\ub2e4. \ub610\ud55c \ubb38, \ucc3d, \uc5d0\uc774\ucee8, \ubcf4\uc77c\ub7ec\uc758 \uc0c1\ud0dc\uac00 \ubcc0\uacbd\ub418\uba74 \uc911\uac1c\uc790\uc5d0\uac8c \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uc54c\ub9ac\uace0 \uc911\uac1c\uc790\ub294 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uac01 \uac1d\uccb4\ub97c \uc81c\uc5b4\ud558\ub294\ub370, \uc5d0\uc774\ucee8\uc744 \uac00\ub3d9 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud558\uba74 \ubcf4\uc77c\ub7ec\ub97c \ub044\uace0 \ubb38\uacfc \ucc3d\uc744 \ub2eb\ub294\ub2e4. \uadf8\ub9ac\uace0 \ubcf4\uc77c\ub7ec\ub97c \uac00\ub3d9 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud558\uba74 \uc5d0\uc774\ucee8\uc744 \ub044\uace0 \ubb38\uacfc \ucc3d\uc744 \ub2eb\ub294\ub2e4. \ubb38\uc774\ub098 \ucc3d\uc774 \uc5f4\ub9ac\ub294 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ub418\uba74 \ubcf4\uc77c\ub7ec\uc640 \uc5d0\uc5b4\ucee8\uc744 \ub048\ub2e4.<\/p>\n<p>\uc911\uac1c\uc790\ub294 Mediator \uc778\ud130\ud398\uc774\uc2a4\ub85c \uad6c\ud604\ud574\uc57c \ud558\uba70 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic interface Mediator {\r\n\tvoid itemsChanged();\r\n}\r\n<\/pre>\n<p>Item\uc740 \uc55e\uc11c \uc5b8\uae09\ud55c \ubb38, \ucc3d, \uc5d0\uc774\ucee8, \ubcf4\uc77c\ub7ec\uc5d0 \ub300\ud55c \uad6c\uccb4\uc801\uc778 \ud074\ub798\uc2a4\uac00 \ubc18\ub4dc\uc2dc \uad6c\ud604\ud574\uc57c\ud560 \ucd94\uc0c1 \ud074\ub798\uc2a4\ub85c \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic abstract class Item {\r\n\tprotected Mediator mediator;\r\n\t\r\n\tpublic Item(Mediator mediator) {\r\n\t\tthis.mediator = mediator;\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc911\uac1c\uc790\ub97c \uad6c\ud604\ud55c AutoHomeSystem \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class AutoHomeSystem implements Mediator {\r\n\tprivate Door door = new Door(this);\r\n\tprivate Window window = new Window(this);\r\n\tprivate CoolAircon aircon = new CoolAircon(this);\r\n\tprivate HeatBoiler boiler = new HeatBoiler(this);\r\n\t\r\n\tpublic void checkWeather(Weather weather) {\r\n\t\tif(weather.isRain()) {\r\n\t\t\twindow.close();\r\n\t\t}\r\n\t\t\r\n\t\tint temperature = weather.getTemperature();\r\n\t\tif(temperature < 10) {\r\n\t\t\taircon.off();\r\n\t\t\tboiler.on();\r\n\t\t} else if(temperature > 30) {\r\n\t\t\taircon.on();\r\n\t\t\tboiler.off();\r\n\t\t} else {\r\n\t\t\taircon.off();\r\n\t\t\tboiler.off();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void itemsChanged() {\t\t\r\n\t\tif(aircon.isRunning()) {\r\n\t\t\tboiler.off();\r\n\t\t\twindow.close();\r\n\t\t\tdoor.close();\r\n\t\t}\r\n\t\t\r\n\t\tif(boiler.isRunning()) {\r\n\t\t\taircon.off();\r\n\t\t\twindow.close();\r\n\t\t\tdoor.close();\r\n\t\t}\r\n\t\t\r\n\t\tif(!door.isClosed() || !window.isClosed()) {\r\n\t\t\taircon.off();\r\n\t\t\tboiler.off();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void report() {\r\n\t\tSystem.out.println(\"\\t\" + door);\r\n\t\tSystem.out.println(\"\\t\" + window);\r\n\t\tSystem.out.println(\"\\t\" + aircon);\r\n\t\tSystem.out.println(\"\\t\" + boiler);\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc704\uc758 \ucf54\ub4dc\ub97c \ubcf4\uba74 \uc911\uac1c\uc790\uac00 \ub0a0\uc528\uc640 \ubb38, \ucc3d, \uc5d0\uc5b4\ucee8, \ubcf4\uc77c\ub7ec\uc758 \uc0c1\ud0dc\ub97c \uac80\uc0ac\ud558\uc5ec \ub2e4\ub978 \uac1d\uccb4\uc758 \uc0c1\ud0dc\ub97c \uc81c\uc5b4\ud558\uace0 \uc788\ub2e4. \ub0a0\uc528 \ud074\ub798\uc2a4\ub97c \ubcf4\uc790.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.Random;\r\n\r\npublic class Weather {\r\n\tprivate boolean bRain = false;\r\n\tprivate int temperature = 0;\r\n\tprivate Random random = new Random();\r\n\t\r\n\tpublic void update() {\r\n\t\tbRain = random.nextInt(4) >= 3;\r\n\t\ttemperature = (int)(random.nextDouble() * 100.0 - 50.0);\r\n\t}\r\n\t\r\n\tpublic boolean isRain() {\r\n\t\treturn bRain;\r\n\t}\r\n\t\r\n\tpublic int getTemperature() {\r\n\t\treturn temperature;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\treturn \"[ Rain: \" + bRain + \", Temperature: \" + temperature + \" ]\";\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc774\uc81c Item \ucd94\uc0c1 \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uc790. \uba3c\uc800 Door \uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Door extends Item {\r\n\tprivate boolean bClosed = false;\r\n\t\r\n\tpublic Door(Mediator mediator) {\r\n\t\tsuper(mediator);\r\n\t}\r\n\r\n\tpublic void open() {\r\n\t\tif(!bClosed) return;\r\n\t\t\r\n\t\tbClosed = false;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic void close() {\r\n\t\tif(bClosed) return;\r\n\t\t\r\n\t\tbClosed = true;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic boolean isClosed() {\r\n\t\treturn bClosed;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"DOOR: \");\r\n\t\t\r\n\t\tif(bClosed) {\r\n\t\t\tsb.append(\"closed\");\r\n\t\t} else {\r\n\t\t\tsb.append(\"opened\");\r\n\t\t}\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 Window \ud074\ub798\uc2a4\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Window extends Item {\r\n\tprivate boolean bClosed = false;\r\n\t\r\n\tpublic Window(Mediator mediator) {\r\n\t\tsuper(mediator);\r\n\t}\r\n\r\n\tpublic void open() {\r\n\t\tif(!bClosed) return;\r\n\t\t\r\n\t\tbClosed = false;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic void close() {\r\n\t\tif(bClosed) return;\r\n\t\t\r\n\t\tbClosed = true;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic boolean isClosed() {\r\n\t\treturn bClosed;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"Window: \");\r\n\t\t\r\n\t\tif(bClosed) {\r\n\t\t\tsb.append(\"closed\");\r\n\t\t} else {\r\n\t\t\tsb.append(\"opened\");\r\n\t\t}\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 CoolAircor \ud074\ub798\uc2a4\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class CoolAircon extends Item {\r\n\tprivate boolean bOff = true;\r\n\t\r\n\tpublic CoolAircon(Mediator mediator) {\r\n\t\tsuper(mediator);\r\n\t}\r\n\r\n\tpublic void on() {\r\n\t\tif(!bOff) return;\r\n\t\t\r\n\t\tbOff = false;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic void off() {\r\n\t\tif(bOff) return;\r\n\t\t\r\n\t\tbOff = true;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic boolean isRunning() {\r\n\t\treturn !bOff;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"CoolAircon: \");\r\n\t\t\r\n\t\tif(bOff) {\r\n\t\t\tsb.append(\"off\");\r\n\t\t} else {\r\n\t\t\tsb.append(\"on\");\r\n\t\t}\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 HeatBoiler \ud074\ub798\uc2a4\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class HeatBoiler extends Item {\r\n\tprivate boolean bOff = true;\r\n\t\r\n\tpublic HeatBoiler(Mediator mediator) {\r\n\t\tsuper(mediator);\r\n\t}\r\n\r\n\tpublic void on() {\r\n\t\tif(!bOff) return;\r\n\t\t\r\n\t\tbOff = false;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic void off() {\r\n\t\tif(bOff) return;\r\n\t\t\r\n\t\tbOff = true;\r\n\t\tmediator.itemsChanged();\r\n\t}\r\n\t\r\n\tpublic boolean isRunning() {\r\n\t\treturn !bOff;\r\n\t}\r\n\t\r\n\tpublic String toString() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"HeatBoiler: \");\r\n\t\t\r\n\t\tif(bOff) {\r\n\t\t\tsb.append(\"off\");\r\n\t\t} else {\r\n\t\t\tsb.append(\"on\");\r\n\t\t}\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc9c0\uae08\uae4c\uc9c0\uc758 \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) throws InterruptedException {\r\n\t\tWeather weather = new Weather();\r\n\t\tAutoHomeSystem home = new AutoHomeSystem();\r\n\t\t\r\n\t\tdo {\r\n\t\t\tweather.update();\r\n\t\t\tSystem.out.println(\"Today's weather -> \" + weather);\r\n\t\t\t\r\n\t\t\thome.checkWeather(weather);\r\n\t\t\thome.report();\r\n\t\t\t\r\n\t\t\tThread.sleep(2000);\r\n\t\t\tSystem.out.println();\r\n\t\t} while(true);\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class='code'>\r\nToday's weather -> [ Rain: false, Temperature: -22 ]\r\n\tDOOR: closed\r\n\tWindow: closed\r\n\tCoolAircon: off\r\n\tHeatBoiler: on\r\n\r\nToday's weather -> [ Rain: false, Temperature: 40 ]\r\n\tDOOR: closed\r\n\tWindow: closed\r\n\tCoolAircon: on\r\n\tHeatBoiler: off\r\n\r\nToday's weather -> [ Rain: false, Temperature: -40 ]\r\n\tDOOR: closed\r\n\tWindow: closed\r\n\tCoolAircon: off\r\n\tHeatBoiler: on\r\n\r\nToday's weather -> [ Rain: false, Temperature: 41 ]\r\n\tDOOR: closed\r\n\tWindow: closed\r\n\tCoolAircon: on\r\n\tHeatBoiler: off\r\n\r\nToday's weather -> [ Rain: false, Temperature: 45 ]\r\n\tDOOR: closed\r\n\tWindow: closed\r\n\tCoolAircon: on\r\n\tHeatBoiler: off\r\n<\/pre>\n<div style='background:#efefef;border-radius:8px;padding:12px 24px'>\uc774 \uae00\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4\uc758 \uae30\ubc18\uc774 \ub418\ub294 GoF\uc758 \ub514\uc790\uc778\ud328\ud134\uc5d0 \ub300\ud55c \uac15\uc758\uc790\ub8cc\uc785\ub2c8\ub2e4. \uc644\uc804\ud55c \uc2e4\uc2b5\uc744 \uc704\ud574 \uc774 \uae00\uc5d0\uc11c \uc18c\uac1c\ud558\ub294 \ud074\ub798\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uacfc \uc608\uc81c \ucf54\ub4dc\ub294 \uc644\uc804\ud558\uac8c \uc2e4\ud589\ub418\ub3c4\ub85d \uc81c\uacf5\ub418\uc9c0\ub9cc, \uc0c1\ub300\uc801\uc73c\ub85c \uc608\uc81c \ucf54\ub4dc\uc640 \uad00\ub828\ub41c \uc124\uba85\uc774 \ud568\ucd95\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0 \ub300\ud574 \uad81\uae08\ud55c \uc810\uc774 \uc788\uc73c\uba74 \ub313\uae00\uc744 \ud1b5\ud574 \ub0a8\uaca8\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ud328\ud134\uba85\uce6d Mediator \ud544\uc694\ud55c \uc0c1\ud669 \uac1d\uccb4\ub4e4 \uac04\uc758 \uc0c1\ud0dc\uac00 \ub610 \ub2e4\ub978 \uac1d\uccb4\uc758 \uc0c1\ud0dc \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \uc904\ub54c \uac01 \uac1d\uccb4\uc758 \uc0c1\ud0dc \ubcc0\ud654\ub97c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc77d\uc5b4 \ucc98\ub9ac\ud558\uae30 \ubcf4\ub2e4 \ud558\ub098\uc758 \uc911\uac1c\uc790(Mediator)\ub97c \ub450\uc5b4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. \uc608\uc81c \ucf54\ub4dc \ub0a0\uc528 \uc815\ubcf4\uc5d0 \ub530\ub77c \uc9d1\uc548\uc758 \ubb38, \ucc3d, \uc5d0\uc5b4\ucee8, \ubcf4\uc77c\ub7ec\uc758 \uac00\ub3d9\uc744 \uc790\ub3d9\ud654\ud558\ub294 \uc608\uc81c\uc774\ub2e4. \ube44\uac00 \uc624\uba74 \ucc3d\uc744 \ub2eb\uace0 \uc628\ub3c4\uac00 0\ub3c4 \ubcf4\ub2e4 \ub5a8\uc5b4\uc9c0\uba74 \ubcf4\uc77c\ub7ec\ub97c \ucf1c\uace0 \uc5d0\uc774\ucee8\uc744 \ub048\ub2e4. \uadf8\ub9ac\uace0 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10541\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[GoF] Mediator \ud328\ud134&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-10541","post","type-post","status-publish","format-standard","hentry","category-design"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10541"}],"version-history":[{"count":4,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10541\/revisions"}],"predecessor-version":[{"id":10573,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10541\/revisions\/10573"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10541"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}