将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
//
Study.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include " stdafx.h "
class Apple
... {
public:
void NamePut()
...{
puts( "これは「リンゴ」です。" ) ;
}
public:
void ColorPut()
...{
puts( "色は「赤」です。" ) ;
}
} ;
// Commandパターン、共通インターフェースを提供
class CommandPtn
... {
public:
virtual void Execute() = 0 ; // 実行
} ;
// 実装
class NameCommand : public CommandPtn
... {
Apple * m_p_apple ;
public:
NameCommand( Apple* in )
...{
m_p_apple = in ;
}
virtual void Execute() // 実行内容を実装
...{
m_p_apple->NamePut() ;
}
} ;
class ColorCommand : public CommandPtn
... {
Apple * m_p_apple ;
public:
ColorCommand( Apple* in )
...{
m_p_apple = in ;
}
virtual void Execute() // 実行内容を実装
...{
m_p_apple->ColorPut() ;
}
} ;
// コマンド
enum COMMAND
... {
NAME_PUT_CMD = 0,
COLOR_PUT_CMD = 1,
} ;
void execute(
enum COMMAND * in_tbl,
int in_tbl_size,
Apple & in_apple
)
... {
NameCommand apple_name_cmd( & in_apple ) ;
ColorCommand apple_color_cmd( & in_apple ) ;
// コマンド群を登録(配列にする意味があるのかな?^^;)
// インターフェースが共通だから配列に登録できるってことだよね。
CommandPtn * cmd_tbl[2] ;
cmd_tbl[NAME_PUT_CMD] = & apple_name_cmd ;
cmd_tbl[COLOR_PUT_CMD] = & apple_color_cmd ;
// コマンド実行
for ( int i=0 ; i<in_tbl_size ; ++i )
...{
cmd_tbl[ in_tbl[i] ]->Execute() ;
}
}
int _tmain( int argc, _TCHAR * argv[])
... {
Apple apple ;
puts( "----普通に実行----" ) ;
...{
apple.NamePut() ;
apple.NamePut() ;
apple.ColorPut() ;
apple.ColorPut() ;
}
puts( "----コマンドテーブルを作って実行----" ) ;
...{
enum COMMAND tbl[] =
...{
NAME_PUT_CMD,
NAME_PUT_CMD,
COLOR_PUT_CMD,
COLOR_PUT_CMD,
} ;
execute( tbl, sizeof(tbl)/sizeof(tbl[0]), apple ) ;
}
return 0 ;
}
//
#include " stdafx.h "
class Apple
... {
public:
void NamePut()
...{
puts( "これは「リンゴ」です。" ) ;
}
public:
void ColorPut()
...{
puts( "色は「赤」です。" ) ;
}
} ;
// Commandパターン、共通インターフェースを提供
class CommandPtn
... {
public:
virtual void Execute() = 0 ; // 実行
} ;
// 実装
class NameCommand : public CommandPtn
... {
Apple * m_p_apple ;
public:
NameCommand( Apple* in )
...{
m_p_apple = in ;
}
virtual void Execute() // 実行内容を実装
...{
m_p_apple->NamePut() ;
}
} ;
class ColorCommand : public CommandPtn
... {
Apple * m_p_apple ;
public:
ColorCommand( Apple* in )
...{
m_p_apple = in ;
}
virtual void Execute() // 実行内容を実装
...{
m_p_apple->ColorPut() ;
}
} ;
// コマンド
enum COMMAND
... {
NAME_PUT_CMD = 0,
COLOR_PUT_CMD = 1,
} ;
void execute(
enum COMMAND * in_tbl,
int in_tbl_size,
Apple & in_apple
)
... {
NameCommand apple_name_cmd( & in_apple ) ;
ColorCommand apple_color_cmd( & in_apple ) ;
// コマンド群を登録(配列にする意味があるのかな?^^;)
// インターフェースが共通だから配列に登録できるってことだよね。
CommandPtn * cmd_tbl[2] ;
cmd_tbl[NAME_PUT_CMD] = & apple_name_cmd ;
cmd_tbl[COLOR_PUT_CMD] = & apple_color_cmd ;
// コマンド実行
for ( int i=0 ; i<in_tbl_size ; ++i )
...{
cmd_tbl[ in_tbl[i] ]->Execute() ;
}
}
int _tmain( int argc, _TCHAR * argv[])
... {
Apple apple ;
puts( "----普通に実行----" ) ;
...{
apple.NamePut() ;
apple.NamePut() ;
apple.ColorPut() ;
apple.ColorPut() ;
}
puts( "----コマンドテーブルを作って実行----" ) ;
...{
enum COMMAND tbl[] =
...{
NAME_PUT_CMD,
NAME_PUT_CMD,
COLOR_PUT_CMD,
COLOR_PUT_CMD,
} ;
execute( tbl, sizeof(tbl)/sizeof(tbl[0]), apple ) ;
}
return 0 ;
}