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.0432 sec