{"id":10476,"date":"2020-10-15T16:11:20","date_gmt":"2020-10-15T07:11:20","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10476"},"modified":"2020-10-25T09:20:18","modified_gmt":"2020-10-25T00:20:18","slug":"chain-of-responsibility-%ed%8c%a8%ed%84%b4","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10476","title":{"rendered":"[GoF] Chain of Responsibility \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134\uba85\uce6d <\/h4>\n<p>Chain of Responsibility<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669 <\/h4>\n<p>\uc5b4\ub5a4 \uae30\ub2a5\uc744 \uad6c\uc131\ud558\ub294 \uc21c\ucc28\uc801\uc778 \ucc98\ub9ac\ub4e4\uc744 \ud074\ub798\uc2a4\ubcc4\ub85c \ub098\ub220 \uad6c\ud604\ud558\uc5ec \uc218\ud589\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4.<\/p>\n<\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc <\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/chain_of_reponsibility.png\" alt=\"\" width=\"698\" height=\"436\" class=\"aligncenter size-full wp-image-10477\" \/><\/p>\n<p>URL\uc744 \uad6c\uc131\ud558\ub294 \uac01 \ubd80\ubd84\uc5d0 \ub300\ud55c \ucc98\ub9ac\ub97c \uc218\ud589\ud558\ub294 \uc608\uc81c\uc774\ub2e4. \uc608\ub97c \ub4e4\uc5b4http:\/\/127.0.0.1:8080\uacfc \uac19\uc740 \uacbd\uc6b0 URL\uc744 \uad6c\uc131\ud558\ub294 Protocol, Port, Address\ub97c \ucd9c\ub825\ud558\ub294 \uae30\ub2a5\uc744 \uac01\uac01 ProtocolParser, PortParser,  AddressParser \ud074\ub798\uc2a4\uac00 \ucc98\ub9ac\ud55c\ub2e4. \uc5f0\uc18d\ub41c \ucc98\ub9ac\ub97c \uc704\ud574 Parser \ud074\ub798\uc2a4\ub97c \ubd80\ubaa8 \ud074\ub798\uc2a4\ub85c \ub454\ub2e4. \uba3c\uc800 \ubd80\ubaa8 \ud074\ub798\uc2a4\uc778 Parser\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage pattern;\r\n\r\npublic abstract class Parser {\r\n\tprotected Parser nextParser = null;\r\n\r\n\tpublic Parser setNext(Parser nextParser) {\r\n\t\tthis.nextParser = nextParser;\r\n\t\treturn this.nextParser;\r\n\t}\r\n\t\r\n\tpublic void run(String url) {\r\n\t\tprocess(url);\r\n\t\tif(nextParser != null) nextParser.run(url); \r\n\t}\r\n\t\r\n\tprotected abstract void process(String url);\r\n}\r\n<\/pre>\n<p>URL \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uad6c\uccb4\uc801\uc778 \ucc98\ub9ac\ub294 process \ucd94\uc0c1 \ud568\uc218\uc5d0\uc11c \uc218\ud589\ud55c\ub2e4. \uba3c\uc800 Protocol\uc744 \ucc98\ub9ac\ud558\ub294 ProtocolParser \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage pattern;\r\n\r\npublic class ProtocolParser extends Parser {\r\n\t@Override\r\n\tpublic void process(String url) {\r\n\t\tint index = url.indexOf(\":\/\/\");\r\n\t\tif(index != -1) {\r\n\t\t\tSystem.out.println(\"PROTOCOL: \" + url.substring(0, index));\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"NO PROTOCOL\");\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>PortParser \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage pattern;\r\n\r\npublic class PortParser extends Parser {\r\n\t@Override\r\n\tpublic void process(String url) {\r\n\t\tint index = url.lastIndexOf(\":\");\r\n\t\tif(index != -1) {\r\n\t\t\tString strPort = url.substring(index+1);\r\n\t\t\ttry {\r\n\t\t\t\tint port = Integer.parseInt(strPort);\r\n\t\t\t\tSystem.out.println(\"PORT: \" + port);\r\n\t\t\t\treturn;\r\n\t\t\t} catch(NumberFormatException e) {\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tSystem.out.println(\"NO PORT\");\r\n\t}\r\n}\r\n<\/pre>\n<p>AddressParser \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage pattern;\r\n\r\npublic class AddressParser extends Parser {\r\n\t@Override\r\n\tpublic void process(String url) {\r\n\t\tint startIndex = url.indexOf(\":\/\/\");\r\n\t\tint lastIndex = url.lastIndexOf(\":\");\r\n\t\t\r\n\t\tif(startIndex == -1) {\r\n\t\t\tif(lastIndex == -1) {\r\n\t\t\t\tSystem.out.println(\"ADDRESS: \" + url);\r\n\t\t\t} else {\r\n\t\t\t\tSystem.out.println(\"ADDRESS: \" + url.substring(0, lastIndex));\r\n\t\t\t}\r\n\t\t} else if(startIndex != lastIndex) {\r\n\t\t\tSystem.out.println(\"ADDRESS: \" + url.substring(startIndex+3, lastIndex));\r\n\t\t} else if(startIndex == lastIndex) {\r\n\t\t\tSystem.out.println(\"ADDRESS: \" + url.substring(startIndex+3));\r\n\t\t} else {\r\n\t\t\tSystem.out.println(\"NO ADDRESS\");\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc704\uc758 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage pattern;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) {\r\n\t\tParser parser = new ProtocolParser();\r\n\t\tParser parser1 = new PortParser();\r\n\t\tParser parser2 = new AddressParser();\r\n\t\t\r\n\t\tparser.setNext(parser1).setNext(parser2);\r\n\r\n\t\tString url = \"http:\/\/127.0.0.1:8080\";\r\n\t\tSystem.out.println(\"INPUT: \" + url);\r\n\t\tparser.run(url);\r\n\t\t\r\n\t\turl = \"127.0.0.1:8080\";\r\n\t\tSystem.out.println(\"\\nINPUT: \" + url);\r\n\t\tparser.run(url);\r\n\t\t\r\n\t\turl = \"http:\/\/127.0.0.1\";\r\n\t\tSystem.out.println(\"\\nINPUT: \" + url);\r\n\t\tparser.run(url);\r\n\t\t\r\n\t\turl = \"127.0.0.1\";\r\n\t\tSystem.out.println(\"\\nINPUT: \" + url);\r\n\t\tparser.run(url);\r\n\t\t\r\n\t}\r\n}\r\n<\/pre>\n<p>\ucd9c\ub825 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class='code'>\r\nINPUT: http:\/\/127.0.0.1:8080\r\nPROTOCOL: http\r\nPORT: 8080\r\nADDRESS: 127.0.0.1\r\n\r\nINPUT: 127.0.0.1:8080\r\nNO PROTOCOL\r\nPORT: 8080\r\nADDRESS: 127.0.0.1\r\n\r\nINPUT: http:\/\/127.0.0.1\r\nPROTOCOL: http\r\nNO PORT\r\nADDRESS: 127.0.0.1\r\n\r\nINPUT: 127.0.0.1\r\nNO PROTOCOL\r\nNO PORT\r\nADDRESS: 127.0.0.1\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 Chain of Responsibility \ud544\uc694\ud55c \uc0c1\ud669 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \uad6c\uc131\ud558\ub294 \uc21c\ucc28\uc801\uc778 \ucc98\ub9ac\ub4e4\uc744 \ud074\ub798\uc2a4\ubcc4\ub85c \ub098\ub220 \uad6c\ud604\ud558\uc5ec \uc218\ud589\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4. \uc608\uc81c \ucf54\ub4dc URL\uc744 \uad6c\uc131\ud558\ub294 \uac01 \ubd80\ubd84\uc5d0 \ub300\ud55c \ucc98\ub9ac\ub97c \uc218\ud589\ud558\ub294 \uc608\uc81c\uc774\ub2e4. \uc608\ub97c \ub4e4\uc5b4http:\/\/127.0.0.1:8080\uacfc \uac19\uc740 \uacbd\uc6b0 URL\uc744 \uad6c\uc131\ud558\ub294 Protocol, Port, Address\ub97c \ucd9c\ub825\ud558\ub294 \uae30\ub2a5\uc744 \uac01\uac01 ProtocolParser, PortParser, AddressParser \ud074\ub798\uc2a4\uac00 \ucc98\ub9ac\ud55c\ub2e4. \uc5f0\uc18d\ub41c \ucc98\ub9ac\ub97c \uc704\ud574 Parser \ud074\ub798\uc2a4\ub97c \ubd80\ubaa8 \ud074\ub798\uc2a4\ub85c \ub454\ub2e4. \uba3c\uc800 \ubd80\ubaa8 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10476\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[GoF] Chain of Responsibility \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-10476","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\/10476","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=10476"}],"version-history":[{"count":5,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10476\/revisions"}],"predecessor-version":[{"id":10559,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10476\/revisions\/10559"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10476"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}