U E D R , A S I H C RSS

Gof/Command


1. Command


1.1. Intent

request ๋ฅผ ๊ฐฒด๋กœ บกА™” ‹œ‚ดœผ๋กœ„œ ๋‹ค๋ฅธ request๋“ค„ ๊ฐ€„ ด๋ผด–ธŠธ๋ฅผ ธž™”‹œ‚ค๊ฐ๋‚˜, request๋ฅผ queue•˜๊ฐ๋‚˜ ๋Œ€๊ธฐ‹œ‚ค๋ฉฐ, undo๊ฐ€ ๊ฐ€๋Šฅ•œ ๋ช…๋ น„ ง€›•œ๋‹ค.

1.2. Also Known As

Action, Transaction

1.3. Motivation

๋•Œ๋•Œ๋กœ š”ฒญ๋ฐ›€ ๋ช…๋ นด๋‚˜ request๋ฅผ ๋ฐ›๋Š” ๊ฐฒด— ๋Œ€•œ  •๋ณด—†ด ๊ฐฒด๋“ค—๊ฒŒ request๋ฅผ ๋„˜๊ฒจ„ ๋•Œ๊ฐ€ žˆ๋‹ค. ˜ˆ๋ฅผ ๋“ค–ด user interface tookit€ buttonด๋‚˜ menuฒ˜๋Ÿผ ‚ฌšฉž ž…๋ ฅ— ๋Œ€•ด ‘๋‹ต•˜๊ธฐ œ„•ด š”ฒญ„ ฒ˜๋ฆฌ•˜๋Š” ๊ฐฒด๋“ค„ ฌ•จ•œ๋‹ค. •˜ง€๋งŒ, ˜คง toolkit„ ‚ฌšฉ•˜๋Š” –ด”Œ๋ฆฌผ€ด…˜๋งŒด –ด๋–ค ๊ฐฒด๊ฐ€ –ด๋–คผ„ •ด•ผ • ง€ •Œ๊ณ  žˆœผ๋ฏ€๋กœ, toolkit€ buttonด๋‚˜ menu— ๋Œ€•ด„œ š”ฒญ— ๋Œ€•ด ๋ช…‹œ œผ๋กœ ๊ตฌ˜„„ •  ˆ˜ —†๋‹ค. toolkit ๋””žด๋„ˆ๋กœ„œ šฐ๋ฆฌ๋Š” request๋ฅผ ๋ฐ›๋Š” ๊ฐœฒด๋‚˜ request๋ฅผ ฒ˜๋ฆฌ•  operations— ๋Œ€•ด •Œง€ ๋ชป•œ๋‹ค.

Command Pattern€ request ๋ฅผ ๊ฐฒด™”•จœผ๋กœ„œ toolkit ๊ฐฒด๋กœ •˜—ฌ๊ธˆ ๋ถˆŠน ••œ –ด”Œ๋ฆฌผ€ด…˜ ๊ฐฒด— ๋Œ€•œ request๋ฅผ ๋งŒ๋“ค๊ฒŒ •œ๋‹ค. ด ๊ฐฒด๋Š” ๋‹ค๋ฅธ ๊ฐฒดฒ˜๋Ÿผ  €žฅ๋  ˆ˜ žˆœผ๋ฉฐ pass around ๊ฐ€๋Šฅ•˜๋‹ค. ด pattern˜ key๋Š” ˆ˜–‰•  ๋ช…๋ น–ด— ๋Œ€•œ ธ„Ž˜ดŠค๋ฅผ „ –ธ•˜๋Š” ถ”ƒ Command class— žˆ๋‹ค. ด ธ„Ž˜ดŠค˜ ๊ฐ€žฅ ๋‹จˆœ•œ ˜•ƒœ—„œ๋Š” ถ”ƒ ธ Execute operation„ ฌ•จ•œ๋‹ค. ๊ตฌฒด™”๋œ Command subclass๋“ค€ request— ๋Œ€•œ receiver๋ฅผ instance ๋ณ€ˆ˜๋กœ  €žฅ•˜๊ณ  request๋ฅผ invoke•˜๊ธฐ œ„•œ Execute operation„ ๊ตฌ˜„•จœผ๋กœ„œ receiver-action ง„ ๊ตฌฒด™”‹œ‚จ๋‹ค. The receiver has the knowledge required to carry out the request.


Menu๋Š” ‰ฝ๊ฒŒ Command Object๋กœ ๊ตฌ˜„๋  ˆ˜ žˆ๋‹ค. Menu ˜ ๊ฐ๊ฐ˜ „ ƒ€ ๊ฐ๊ฐ MenuItem ด๋ž˜Šค˜ ธŠค„Šคด๋‹ค. Application ด๋ž˜Šค๋Š” ด ๋ฉ”๋‰ด๋“ค๊ณผ ๋‚˜๋จธง€ œ  € ธ„Ž˜ดŠค— ๋”ฐ๋ผ„œ ๋ฉ”๋‰ด•„ด…œ„ ๊ตฌ„•œ๋‹ค. Application ด๋ž˜Šค๋Š” œ  €๊ฐ€ —ด Document ๊ฐฒด˜ track„ œ ง€•œ๋‹ค.

–ด”Œ๋ฆฌผ€ด…˜€ ๊ฐ๊ฐ˜ ๊ตฌฒด ธ Command ˜ subclass๋“ค๋กœ ๊ฐ๊ฐ€๊ฐMenuItem ๊ฐฒด๋ฅผ „ ••œ๋‹ค. ‚ฌšฉž๊ฐ€ MenuItem„ „ ƒ–ˆ„๋•Œ MenuItem€ ๋ฉ”๋‰ด•„ด…œ˜ •ด๋‹น ๋ช…๋ นœผ๋กœ„œ Execute oeration„ ˜ธถœ•˜๊ณ , Execute๋Š” ‹ค œ˜ ๋ช…๋ น„ ˆ˜–‰•œ๋‹ค. MenuItem๊ฐฒด๋“ค€ ž‹ ๋“คด ‚ฌšฉ•  Command˜ subclass— ๋Œ€•œ  •๋ณด๋ฅผ ๊ฐ€ง€๊ณ  žˆง€ •Š๋‹ค. Command subclass๋Š” •ด๋‹น request— ๋Œ€•œ receiver๋ฅผ  €žฅ•˜๊ณ , receiver˜ •˜๋‚˜๋‚˜ ๊ทธ ดƒ˜ ๋ช…๋ น–ด๋“ค„ invoke•œ๋‹ค.

˜ˆ๋ฅผ ๋“ค–ด PasteCommand๋Š” clipboard— žˆ๋Š” text๋ฅผ Document— ๋ถ™ด๋Š” ๊ธฐ๋Šฅ„ ง€›•œ๋‹ค. PasteCommand ˜ receiver๋Š” ธŠค„Šค™”• ๋•Œ „ •๋˜–ดžˆ๋Š” Docuemnt๊ฐฒดด๋‹ค. Execute ๋ช…๋ น€ •ด๋‹น ๋ช…๋ น˜ receiverธ Document˜ Paste operation „ invoke •œ๋‹ค.


OpenCommand˜ Execute operation€ ๋‹ค๋ฅด๋‹ค. OpenCommand๋Š” ‚ฌšฉž—๊ฒŒ ๋ฌธ„œ ด๋ฆ„„ ๋ฌผ€๋’ค, ๋Œ€‘•˜๋Š” Document ๊ฐฒด๋ฅผ ๋งŒ๋“ค๊ณ , •ด๋‹น ๋ฌธ„œ๋ฅผ —ฌ๋Š” –ด”Œ๋ฆฌผ€ด…˜— ๋ฌธ„œ๋ฅผ ถ”๊ฐ€•œ ๋’ค (MDI๋ฅผ ƒ๊ฐ• ๊ฒƒ) ๋ฌธ„œ๋ฅผ —ฐ๋‹ค.


๋•Œ๋•Œ๋กœ MenuItem€ —ฐ†๋œ ๋ช…๋ น–ด๋“ค˜ ผ๊ด„ˆ˜–‰„ •„š”๋กœ •œ๋‹ค. ˜ˆ๋ฅผ ๋“ค–ด„œ •ด๋‹น Ž˜ดง€๋ฅผ ค‘•™— ๋†“๊ณ  ผ๋ฐ˜ฌ๊ธฐ™” ‹œ‚ค๋Š” MenuItem€ CenterDocumentCommand ๊ฐฒด™€ NormalSizeCommand ๊ฐฒด๋กœ ๋งŒ๋“ค ˆ˜ žˆ๋‹ค. ด๋Ÿฌ•œ ๋ฐฉ‹œผ๋กœ ๋ช…๋ น–ด๋“ค„ ด–ดง€๊ฒŒ •˜๋Š” ๊ฒƒ€ ผ๋ฐ˜ ด๋ฏ€๋กœ, šฐ๋ฆฌ๋Š” ๋ณตˆ˜๋ช…๋ น„ ˆ˜–‰•˜๊ธฐ œ„•œ MenuItem„ —ˆšฉ•˜๊ธฐ œ„•ด MacroCommand๋ฅผ  •˜•  ˆ˜ žˆ๋‹ค. MacroCommand๋Š” ๋‹จˆœžˆ ๋ช…๋ น–ด๋“ค˜ sequence๋ฅผ ˆ˜–‰•˜๋Š” Command subclass˜ ๊ตฌฒด™”ด๋‹ค. MacroCommand๋Š” MacroCommand๋ฅผ ด๋ฃจ๊ณ  žˆ๋Š” command๋“คด ๊ทธ๋“ค˜ receiver๋ฅผ  •˜•˜๋ฏ€๋กœ ๋ช…‹œ ธ receiver๋ฅผ ๊ฐ€ง€ง€ •Š๋Š”๋‹ค.


ด๋Ÿฌ•œ ˜ˆ๋“ค—„œ, –ด๋–ป๊ฒŒ Command patternด •ด๋‹น ๋ช…๋ น„ invoke•˜๋Š” ๊ฐฒด™€ ๋ช…๋ น„ ˆ˜–‰•˜๋Š”  •๋ณด๋ฅผ ๊ฐ€„ ๊ฐฒด๋ฅผ ๋ถ„๋ฆฌ•˜๋Š”ง€ ฃผ๋ชฉ•˜๋ผ. ด๋Ÿฌ•จ€ œ  €ธ„Ž˜ดŠค๋ฅผ ๋””žธ•จ— žˆ–ด„œ ๋งŽ€ œ —ฐ„„  œ๊ณต•œ๋‹ค. –ด”Œ๋ฆฌผ€ด…˜€ ๋‹จง€ menu™€ push buttonด ๊ฐ™€ ๊ตฌฒด ธ Command subclass˜ ธŠค„Šค๋ฅผ ๊ณตœ •จœผ๋กœ„œ menu ™€ push button ธ„Ž˜ดŠค  œ๊ณต•  ˆ˜ žˆ๋‹ค. šฐ๋ฆฌ๋Š” ๋™ œผ๋กœ command๋ฅผ ๋ฐ”๊ฟ€ ˆ˜ žˆœผ๋ฉฐ, ด๋Ÿฌ•จ€ context-sensitive menu ๋ฅผ ๊ตฌ˜„•˜๋Š”๋ฐ œ šฉ•˜๋‹ค. ๋˜•œ šฐ๋ฆฌ๋Š” ๋ช…๋ น–ด๋“ค„ ปค๋‹ค๋ž€ ๋ช…๋ น–ด— •˜๋‚˜๋กœ กฐ•ฉ•จœผ๋กœ„œ command scripting„ ง€›•  ˆ˜ žˆ๋‹ค. ด๋Ÿฌ•œ ๋ชจ๋“  ๊ฒƒ€ request๋ฅผ issue•˜๋Š” ๊ฐฒด๊ฐ€ ˜คง –ด๋–ป๊ฒŒ issue™” •˜๋Š”ง€๋งŒ •Œ๊ณ  žˆœผ๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ— ๊ฐ€๋Šฅ•˜๋‹ค. request๋ฅผ ๋‚˜ƒ€๋‚ด๋Š” ๊ฐฒด๋Š” –ด๋–ป๊ฒŒ request๊ฐ€ ˆ˜–‰๋˜–ด•ผ • ง€ •Œ •„š”๊ฐ€ —†๋‹ค.

1.4. Applicability

๋‹คŒ๊ณผ ๊ฐ™€ ๊ฒฝšฐ— CommandPattern„ ดšฉ•˜๋ผ.

  • MenuItem ๊ฐฒด๊ฐ€ •˜๋ ค๋Š” ผ„„˜–ด„œ ˆ˜–‰•˜๋ ค๋Š” action— ˜•ด ๊ฐฒด๋ฅผ„ ธž™”‹œ‚ฌ๋•Œ. ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” procedural language—„œ˜ callback •จˆ˜ฒ˜๋Ÿผ ธž™”‹œ‚ฌ ˆ˜ žˆ๋‹ค. Command๋Š” callback•จˆ˜— ๋Œ€•œ ๊ฐฒดง€–ฅ ธ ๋Œ€•ˆด๋‹ค.

  • ๋‹ค๋ฅธ ‹œ๊ฐ„๋Œ€— request๋ฅผ ๊ตฌฒด™”•˜๊ฐ๋‚˜ queue•˜๊ฐ๋‚˜ ˆ˜–‰•˜๊ธฐ ›• ๋•Œ. Command ๊ฐฒด๋Š” request™€ ๋…๋ฆฝ ธ lifetime„ ๊ฐ€ˆ ˆ˜ žˆ๋‹ค. ๋งŒผ request˜ receiver๊ฐ€ ๊ณต๊ฐ„ ๋…๋ฆฝ ธ ๋ฐฉ๋ฒ•œผ๋กœ (๋„Šธ›Œฌ ๋“) ฃผ†Œ๋ฅผ ‘œ˜„•  ˆ˜ žˆ๋‹ค๋ฉด ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” request— ๋Œ€•œ Command ๊ฐฒด๋ฅผ ๋‹ค๋ฅธ ”„๋กœ„Šค—๊ฒŒ  „๋‹ฌ•˜—ฌ ฒ˜๋ฆฌ•  ˆ˜ žˆ๋‹ค.

  • undo ๊ธฐ๋Šฅ„ ง€›•˜๊ธฐ ›• ๋•Œ. Command˜ Execute operation€ •ด๋‹น Command˜ šจ๊ณผ๋ฅผ ๋˜๋Œ๋ฆฌ๊ธฐ œ„•œ state๋ฅผ  €žฅ•  ˆ˜ žˆ๋‹ค. Command ๋Š” Execute ˆ˜–‰˜ šจ๊ณผ๋ฅผ ๋˜๋Œ๋ฆฌ๊ธฐ œ„•œ Unexecute operation„ ธ„Ž˜ดŠค๋กœ„œ ถ”๊ฐ€•ด•ผ •œ๋‹ค. ˆ˜–‰๋œ command๋Š” history list—  €žฅ๋œ๋‹ค. history list๋ฅผ •ž ๋’ค๋กœ ๊ฒ€ƒ‰•˜๋ฉด„œ Unexecute™€ Execute๋ฅผ ๋ถ€๋ฆ„œผ๋กœ„œ ๋ฌด œ•œ˜ undo๊ธฐ๋Šฅ๊ณผ redo๊ธฐ๋Šฅ„ ง€›•  ˆ˜ žˆ๊ฒŒ ๋œ๋‹ค.

  • logging change๋ฅผ ง€›•˜๊ธฐ ›• ๋•Œ. logging change ๋ฅผ ง€›•จœผ๋กœ„œ ‹œŠค…œ ถฉ๋Œด ๋‚œ ๊ฒฝšฐ— ๋Œ€•ด •ด๋‹น command๋ฅผ žฌ‹œ๋„ •  ˆ˜ žˆ๋‹ค. Command ๊ฐฒด— load ™€ store operation„ ถ”๊ฐ€•จœผ๋กœ„œ change˜ log๋ฅผ œ ง€•  ˆ˜ žˆ๋‹ค. crash๋กœ๋ถ€„ฐ ๋ณต๊ตฌ•˜๋Š” ๊ฒƒ€ ๋””Šคฌ๋กœ๋ถ€„ฐ logged command๋ฅผ ฝ–ด๋“คด๊ณ  Execute operation„ žฌ‹ค–‰•˜๋Š” ๊ฒƒ€ ค‘š”•œ ๋ถ€๋ถ„ด๋‹ค.

  • ๊ธฐ๋ณธ๋ช…๋ น–ด๋“ค๋ฅผ ๊ธฐ๋ฐ˜œผ๋กœ ดšฉ•œ •˜ด๋ ˆ๋ฒจ˜ ๋ช…๋ น๋“ค๋กœ ‹œŠค…œ„ กฐง•  ๋•Œ. ๊ทธ๋Ÿฌ•จ กฐง€ transaction„ ง€›•˜๋Š”  •๋ณด‹œŠค…œ—„œ ๋ณดŽธ™”๋œ ๋ฐฉ‹ด๋‹ค. transaction€ ๋ฐด„˜ ๋ณ€™”˜ ง‘•ฉ„ บกА™”•œ๋‹ค. CommandPattern€ transaction„ ๋””žธ•˜๋Š” •˜๋‚˜˜ ๋ฐฉ๋ฒ•„  œ๊ณต•œ๋‹ค. Command๋“ค€ ๊ณต†ต๋œ ธ„Ž˜ดŠค๋ฅผ ๊ฐ€ง€๋ฉฐ, ๋ชจ๋“  transaction๋ฅผ ๊ฐ™€ ๋ฐฉ๋ฒ•œผ๋กœ invoke•  ˆ˜ žˆ๋„๋ก •œ๋‹ค. CommandPattern€ ๋˜•œ ƒˆ๋กœšด transaction๋“ค„ ‹œŠค…œ— ™•žฅ‹œ‚ค๊ธฐ ‰ฝ๊ฒŒ •œ๋‹ค.

1.6. Participants

  • Command
    - ˆ˜–‰•  operation„ œ„•œ ธ„Ž˜ดŠค๋ฅผ „ –ธ•œ๋‹ค.
  • ConcreteCommand (PasteCommand, OpenCommand)
    - Receiver ๊ฐฒด™€ action ๋ฌถŒ„  •˜•œ๋‹ค.
  • Client (Application)
    - ConcreteCommand ๊ฐฒด๋ฅผ ๋งŒ๋“ค๊ณ  receiver๋กœ  ••œ๋‹ค.
  • Invoker (MenuItem)
    - command —๊ฒŒ request๋ฅผ ˆ˜–‰•˜๋„๋ก š”ฒญ•œ๋‹ค.
  • Receiver (Document, Application)
    - ฒ˜๋ฆฌ•  request— ๋Œ€•ด ๋ช…๋ น–ด๋“ค„ –ด๋–ป๊ฒŒ ˆ˜–‰•ด•ผ • ง€ •Œ๊ณ  žˆ๋‹ค. –ด๋– •œ ด๋ž˜Šค๋“ ง€ Receiver๋กœ„œ ™œ๋™๊ฐ€๋Šฅ•˜๋‹ค.

1.7. Collaborations

  • client๋Š” ConcreteCommand ๊ฐฒด๋ฅผ ๋งŒ๋“ค๊ณ , receiver๋ฅผ  ••œ๋‹ค.
  • Invoker ๊ฐฒด๋Š” ConcreteCommand๊ฐฒด๋ฅผ  €žฅ•œ๋‹ค.
  • invoker๋Š” command—„œ Execute๋ฅผ ˜ธถœ•จœผ๋กœ„œ request๋ฅผ issue•œ๋‹ค. ๋ช…๋ น–ด๊ฐ€ undo๊ฐ€๋Šฅ• ๋•Œ, ConcreteCommand๋Š” ๋ช…๋ น–ด๋ฅผ undo•˜๊ธฐ œ„•œ state๋ฅผ  €žฅ•œ๋‹ค.
  • ConcreteCommand ๊ฐฒด๋Š” request๋ฅผ ฒ˜๋ฆฌ•˜๊ธฐ œ„•ด receiver—„œ operation„ invoke•œ๋‹ค.

๋‹คŒ˜ ๋‹คด–ด๊ทธ๋žจ€ ด ๊ฐฒด๋“คด –ด๋–ป๊ฒŒ ƒ˜ธž‘šฉ•˜๋Š”ง€ ๋ณด—ฌค€๋‹ค. ด ๋‹คด–ด๊ทธ๋žจ€ ๋˜•œ –ด๋–ป๊ฒŒ Command ๊ฐ€ receiver™€ ฒ˜๋ฆฌ•  request๋กœ๋ถ€„ฐ invoker๋ฅผ ๋ถ„๋ฆฌ•˜๋Š”ง€ „ค๋ช…•œ๋‹ค.


1.8. Consequences


CommandPattern€ ๋‹คŒ๊ณผ ๊ฐ™€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€ ธ˜จ๋‹ค.
  1. Command๋Š” •ด๋‹น ๊ฐฒด˜ ๋ช…๋ น„ invoke•˜๋Š” ๊ฐฒด™€ –ด๋–ป๊ฒŒ ˆ˜–‰•ด•ผ • ง€ •Œ๊ณ  žˆ๋Š” ๊ฐฒด™€˜ ๊ฒฐ•ฉ„ •ด œ•œ๋‹ค.
  2. Command๋Š” ฒซ๋ฒˆงธ๋‹จ๊ณ„˜ ด๋ž˜Šค ๊ฐฒดด๋‹ค. Command๋Š” กฐž‘๋˜–ดˆ ˆ˜ žˆœผ๋ฉด„œ ๋‹ค๋ฅธ ๊ฐฒด๋“ค๊ณผ ๋งˆฐฌ๊ฐ€ง€๋กœ ™•žฅ๊ฐ€๋Šฅ•˜๋‹ค.
  3. Command๋ฅผ ๋ฌถ„ ˆ˜ žˆ๋‹ค. •ž„œ „ค๋ช…•œ MacroCommand๊ฐ€ ๊ทธ ˜ˆ๊ฐ€ ๋œ๋‹ค. ผ๋ฐ˜ œผ๋กœ composite command๋“ค€ CompositePattern˜ ธŠค„Šคด๋‹ค.
  4. ƒˆ๋กœšด Command๋ฅผ ถ”๊ฐ€•˜๊ธฐ๊ฐ€ ‰ฝ๋‹ค. ™œ๋ƒ•˜๋ฉด ด๋ฏธ กดžฌ•˜๊ณ žˆ๋Š” ด๋ž˜Šค๋“ค„ ๊ณ น  •„š”๊ฐ€ —†๊ธฐ ๋•Œ๋ฌธด๋‹ค.

1.9. Implementation


1.10. Sample Code

—ฌ๊ธฐ ๋ณด—ฌง€๋Š” C++ code๋Š” Motivation „…˜˜ Command ฌ๋ž˜Šค— ๋Œ€•œ ๋Œ€๊ฐ•˜ ๊ตฌ˜„ด๋‹ค. šฐ๋ฆฌ๋Š” OpenCommand, PasteCommand ™€ MacroCommand๋ฅผ  •˜•  ๊ฒƒด๋‹ค. ๋จผ € ถ”ƒ Commmand class ๋Š” ด๋ ‡๋‹ค.
~cpp 
class Command {
public:
	virtual ~Command ();

	virtual void Execute () = 0;
protected:
	Command ();
};

OpenCommand๋Š” œ  €๋กœ๋ถ€„ œ๊ณต๋œ ด๋ฆ„˜ ๋ฌธ„œ๋ฅผ —ฐ๋‹ค. OpenCommand๋Š” ๋ฐ˜๋“œ‹œ Constructor— Application ๊ฐฒด๋ฅผ ๋„˜๊ฒจ๋ฐ›•„•ผ •œ๋‹ค. AskUser ๋Š” œ  €—๊ฒŒ —ด–ด•ผ •  ๋ฌธ„œ˜ ด๋ฆ„„ ๋ฌป๋Š” ๋ฃจ‹ด„ ๊ตฌ˜„•œ๋‹ค.

~cpp 
class OpenCommand : public Command {
public:
	OpenCommand (Application*);

	virtual void Execute ();
protected:
	virtual const char* AskUser ();
private:
	Application* _application;
	char* _response;
};

OpenCommand::OpenCommand (Application* a) {
	_application = a;
}

void OpenCommand::Execute () {
	const char* name = AskUser ();

	if (name != 0) {
		Document* document = new Document (name);
		_application->Add (document);
		document->Open ();
	}
}

PasteCommand ๋Š” receiver๋กœ„œ Document๊ฐฒด๋ฅผ ๋„˜๊ฒจ๋ฐ›•„•ผ •œ๋‹ค. receiver๋Š” PasteCommand˜ constructor˜ parameter๋กœ„œ ๋ฐ›๋Š”๋‹ค.
~cpp 
class PasteCommand : public Command {
public:
	PasteCommand (Document*);

	virtual void Execute ();
private:
	Document* _document;
};

PasteCommand::PasteCommand (Document* doc) {
	_document = doc;
}

void PasteCommand::Execute () {
	_document->Paste ();
}

undo •  •„š”๊ฐ€ —†๊ณ , ธž๋ฅผ š”๊ตฌ•˜ง€ •Š๋Š” ๋‹จˆœ•œ ๋ช…๋ น–ด— ๋Œ€•ด„œ šฐ๋ฆฌ๋Š” command˜ receiver๋ฅผ parameterize•˜๊ธฐ œ„•ด class template๋ฅผ ‚ฌšฉ•  ˆ˜ žˆ๋‹ค. šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌ•œ ๋ช…๋ น๋“ค„ œ„•ด template subclassธ SimpleCommand๋ฅผ  •˜•  ๊ฒƒด๋‹ค. SimpleCommand๋Š” Receiver type— ˜•ด parameterize ๋˜๊ณ 

~cpp 
template <class Receiver>
class SimpleCommand : public Command {
public:
	typedef void (Receiver::* Action) ();

	SimpleCommand (Receiver* r, Action a) : 
		_receiver (r), _action (a) { }

	vitual void Execute ();

private:
	Action _action;
	Receiver* _receiver;
};

constructor๋Š” receiver™€ instance ๋ณ€ˆ˜— ๋Œ€‘๋˜๋Š” action„  €žฅ•œ๋‹ค. Execute๋Š” ๋‹จˆœžˆ action„ receiver—  šฉ•œ๋‹ค.
~cpp 
template <class Receiver>
void Simplecommand<Receiver>::Execute () {
	(_receiver->*_action) ();

MyClass˜ instance๋กœ žˆ๋Š” Action„ ˜ธถœ•  command๋ฅผ ๋งŒ๋“ค๊ธฐ œ„•ด„œ, ด๋ผด–ธŠธ๋Š” ๋‹จˆœžˆ ด๋ ‡๊ฒŒ ฝ”๋”ฉ•œ๋‹ค.
~cpp 
MyClass* receiver = new MyClass;
// ...
Command* aCommand = 
	new SimpleCommand<MyClass> (receiver, &MyClass::Action);
// ...
aCommand->Execute ();

ด ๋ฐฉ๋ฒ•€ ๋‹จง€ ๋‹จˆœ•œ ๋ช…๋ น–ด—๋Œ€•œ •ด๊ฒฐ…ผ ๋ฟž„„ ๋ช…‹ฌ•˜๋ผ. track„ œ ง€•˜๊ฐ๋‚˜, receiver™€ undo state๋ฅผ argument ๋กœ •„š”๋กœ •˜๋Š” ข€๋” ๋ณตžก•œ ๋ช…๋ น๋“ค€ Command˜ subclass๋ฅผ š”๊ตฌ•œ๋‹ค.

MacroCommand๋Š” ๋ถ€๋ช…๋ น–ด๋“ค˜ sequence๋ฅผ ๊ด€๋ฆฌ•˜๊ณ  ๋ถ€๋ช…๋ น–ด๋“ค„ ถ”๊ฐ€•˜๊ฐ๋‚˜ ‚ญ œ•˜๋Š” operation„  œ๊ณต•œ๋‹ค. subcommand๋“ค€ ด๋ฏธ ๊ทธ๋“ค˜ receiver๋ฅผ  •˜•˜๋ฏ€๋กœ MacroCommand๋Š” ๋ช…‹œ ธ receiver๋ฅผ š”๊ตฌ•˜ง€ •Š๋Š”๋‹ค.

~cpp 
class MacroCommand : public Command {
public:
	MacroCommand ();
	virtual ~MacroCommand ();

	virtual void Add (Command*);
	virtual void Remove (Command*);

	virtual void Execute ();

private:
	List<Command*>* _cmds;
};

MacroCommand˜ —ด‡ ๋Š” Execute ๋งด๋ฒ„•จˆ˜— žˆ๋‹ค. ด๊ฒƒ€ ๋ชจ๋“  ๋ถ€๋ช…๋ น–ด๋“ค„ ƒƒ‰•˜๋ฉด„œ ๊ทธ๋“ค ๊ฐ๊ฐ˜ Execute operation๋ฅผ ˆ˜–‰•œ๋‹ค.

~cpp 
void MacroCommand::Execute () {
	ListIterator<Command*> i (_cmds);
	
	for (i.First (); !i.IsDone (); i.Next()) {
		Command* c = i.CurrentItem ();
		c->Execute ();
	}
}


MacroCommand ๊ฐ€ Unexecute operation„ ๊ตฌ˜„•˜๊ธฐ œ„•ด„œ MacroCommand˜ ๋ถ€๋ช…๋ น–ด๋“ค€ Execute operation—„œ ๊ตฌ˜„๋œ ˆœ„œ˜ —ญˆœœผ๋กœ ฐธกฐ๋˜๋ฉด„œ unexecute•ด•ผ •จ„ ˆ™ง€•˜ž.

ตœข… œผ๋กœ MacroCommand ๋Š” ๋ถ€๋ช…๋ น–ด๋“ค„ ๊ด€๋ฆฌ•  operation„  œ๊ณต•ด•ผ•œ๋‹ค. MacroCommand๋Š” ๋˜•œ MacroCommand๋ฅผ ด๋ฃจ๋Š” ๋ถ€๋ช…๋ น–ด๋“ค„ ‚ญ œ•  …ž„„ „๋‹ค.

~cpp 
void MacroCommand::Add (Command* c) {
	_cmds->Append (c);
}

void MacroCommand::Remove (Command* c) {
	_cmds->Remove (c);
}


1.11. Known Uses

•„๋งˆ๋„ CommandPattern— ๋Œ€•œ ฒซ๋ฒˆงธ ˜ˆ œ๋Š” Lieberman ˜ ๋…ผ๋ฌธ(Lie85)—„œ ๋‚˜ƒ€๋‚ฌ„ ๊ฒƒด๋‹ค. MacApp App89 ๋Š” undo๊ฐ€๋Šฅ•œ ๋ช…๋ น˜ ๊ตฌ˜„„ œ„•œ command˜ ‘œ๊ธฐ๋ฅผ ๋Œ€ค‘™”‹œผฐ๋‹ค. ET++WGM88, InterViews LCI+92, UnidrawVL90 —ญ‹œ CommandPatter— ๋”ฐ๋ผ ด๋ž˜Šค๋“ค„  •˜–ˆ๋‹ค. InterViews๋Š” ๊ฐ ๊ธฐ๋Šฅ๋ณ„ ๋ช…๋ น— ๋Œ€•œ Action ถ”ƒ ด๋ž˜Šค๋ฅผ  •˜–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  action ๋ฉ”†Œ๋“œ— ˜•ด ธž™”๋จœผ๋กœ„œ ž๋™ œผ๋กœ command subclass๋“ค„ ธŠค„Šค™” ‹œ‚ค๋Š” ActionCallback …œ”Œ๋ฆฟ๋„  •˜•˜˜€๋‹ค.

THINK ด๋ž˜Šค ๋ผด๋ธŒ๋Ÿฌ๋ฆฌ Sym93b ๋˜•œ undo ๊ฐ€๋Šฅ•œ ๋ช…๋ น„ ง€›•˜๊ธฐ œ„•ด CommandPattern„ ‚ฌšฉ•œ๋‹ค. THINK —„œ˜ Command๋“ค€ "Tasks" ๋กœ ๋ถˆ๋ฆฐ๋‹ค. Task ๊ฐฒด๋“ค€ ChainOfResponsibilityPattern— ž…๊ฐ•˜—ฌ ๋„˜๊ฒจง€๊ณ  †Œ๋น„๋˜–ด„๋‹ค.

AddMe)

1.12. Related Patterns

CompositePattern ๋Š” MacroCommand๋ฅผ ๊ตฌ˜„•˜๋Š”๋ฐ ดšฉ๋  ˆ˜ žˆ๋‹ค.

MementoPattern € undo๋ฅผ œ„•œ state๋ฅผ œ ง€•  ˆ˜ žˆ๋‹ค.

history list — œ„น˜•˜๊ธฐ  „— ๋ณต‚ฌ๋˜—ฌ•ผ •  command๋Š” Prototypeœผ๋กœ„œ ž‘šฉ•œ๋‹ค.



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0357 sec