Search

์ปค๋งจ๋“œ ํŒจํ„ด

์ปค๋งจ๋“œ ํŒจํ„ด (Command Pattern)

์ปค๋งจ๋“œ ํŒจํ„ด์€ ์š”์ฒญ์„ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ์บก์Šํ™”ํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๊ณ , ์š”์ฒญ์„ ํ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ๋กœ ๊ธฐ๋กํ•˜๋ฉฐ, ์‹คํ–‰ ์ทจ์†Œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ–‰์œ„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋Š” ๊ฐ์ฒด์™€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
์š”์ฒญ์„ ๊ฐ์ฒด๋กœ ์บก์Šํ™”ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์š”์ฒญ์„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”
โ€ข
์‹คํ–‰ ์ทจ์†Œ(undo)์™€ ์žฌ์‹คํ–‰(redo) ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
โ€ข
์š”์ฒญ์˜ ํ์ž‰๊ณผ ๋กœ๊น… ์ง€์›
โ€ข
๋ฐœ์‹ ์ž์™€ ์ˆ˜์‹ ์ž์˜ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ

ํŠน์ง•

โ€ข
๋ช…๋ น(Command), ์ˆ˜์‹ ์ž(Receiver), ๋ฐœ์‹ ์ž(Invoker), ํด๋ผ์ด์–ธํŠธ(Client) ๋„ค ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ
โ€ข
๊ฐ ๋ช…๋ น์€ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๋กœ ์กด์žฌํ•˜์—ฌ ํ™•์žฅ์„ฑ์ด ์ข‹์Œ
โ€ข
์ƒˆ๋กœ์šด ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ •์ด ๋ถˆํ•„์š”
โ€ข
๋ช…๋ น์˜ ์‹คํ–‰ ์ด๋ ฅ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

์˜ˆ์‹œ ์ฝ”๋“œ

// Command ์ธํ„ฐํŽ˜์ด์Šค interface Command { void execute(); } // ๊ตฌ์ฒด์ ์ธ Command class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.turnOn(); } } // Receiver class Light { public void turnOn() { System.out.println("์กฐ๋ช…์ด ์ผœ์กŒ์Šต๋‹ˆ๋‹ค."); } } // Invoker class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); } } // Client public class Main { public static void main(String[] args) { Light light = new Light(); Command lightOn = new LightOnCommand(light); RemoteControl remote = new RemoteControl(); remote.setCommand(lightOn); remote.pressButton(); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์ปค๋งจ๋“œ ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์กฐ๋ช… ์ œ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
โ€ข
Command ์ธํ„ฐํŽ˜์ด์Šค: ๋ชจ๋“  ์ปค๋งจ๋“œ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” execute() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
LightOnCommand ํด๋ž˜์Šค: Command ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ปค๋งจ๋“œ๋กœ, ์กฐ๋ช…์„ ์ผœ๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Light ํด๋ž˜์Šค (Receiver): ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ˆ˜์‹ ์ž ํด๋ž˜์Šค๋กœ, ์กฐ๋ช…์„ ์ผœ๋Š” ์‹ค์ œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
RemoteControl ํด๋ž˜์Šค (Invoker): ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ˜ธ์ถœ์ž๋กœ, ๋ฒ„ํŠผ ๋ˆ„๋ฆ„ ๋™์ž‘์„ ํ†ตํ•ด ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Main ํด๋ž˜์Šค (Client): ์ „์ฒด ๊ฐ์ฒด๋“ค์„ ์กฐํ•ฉํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
์ด ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ชจ์ปจ(Invoker)์€ ์กฐ๋ช…(Receiver)์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ง์ ‘ ์•Œ ํ•„์š” ์—†์ด, ์ปค๋งจ๋“œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์กฐ๋ช…์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ปค๋งจ๋“œ(์˜ˆ: ์กฐ๋ช… ๋„๊ธฐ, ๋ฐ๊ธฐ ์กฐ์ ˆ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋„ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด ์ปค๋งจ๋“œ ํด๋ž˜์Šค๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.