PHP设计模式学习笔记: 命令模式(Command)
jopen
10年前
// 书本信息操纵类,包括书本的所有操作命令的方法 class BookCommandee { private $author; private $title; function __construct($title_in, $author_in) { $this->setAuthor($author_in); $this->setTitle($title_in); } function getAuthor() { return $this->author; } function setAuthor($author_in) { $this->author = $author_in; } function getTitle() { return $this->title; } function setTitle($title_in) { $this->title = $title_in; } function setStarsOn() { $this->setAuthor(str_replace(' ','*',$this->getAuthor())); $this->setTitle(str_replace(' ','*',$this->getTitle())); } function setStarsOff() { $this->setAuthor(str_replace('*',' ',$this->getAuthor())); $this->setTitle(str_replace('*',' ',$this->getTitle())); } function getAuthorAndTitle() { return $this->getTitle().' by '.$this->getAuthor(); } } // 抽象类,规定必须有书本操纵类属性和exexute()方法 abstract class BookCommand { protected $bookCommandee; function __construct($bookCommandee_in) { $this->bookCommandee = $bookCommandee_in; } abstract function execute(); } // 继承自BookCommand抽象类的专门加星标的类 class BookStarsOnCommand extends BookCommand { function execute() { $this->bookCommandee->setStarsOn(); } } // 继承自BookCommand抽象类的专门去星标的类 class BookStarsOffCommand extends BookCommand { function execute() { $this->bookCommandee->setStarsOff(); } } writeln('开始测试命令模式'); writeln(''); // 创建一个书本操纵类 $book = new BookCommandee('Design Patterns', 'Gamma, Helm, Johnson, and Vlissides'); // 可以用这个类得到它的书名等属性 writeln('创建book之后: '); writeln($book->getAuthorAndTitle()); writeln(''); // 创建一个专门加星标的类 // 调用它的execute()方法,给书本加星标 $starsOn = new BookStarsOnCommand($book); callCommand($starsOn); writeln('book加星标之后: '); writeln($book->getAuthorAndTitle()); writeln(''); // 创建一个专门去星标的类 // 调用它的execute()方法,给书本去星标 $starsOff = new BookStarsOffCommand($book); callCommand($starsOff); writeln('book去星标之后: '); writeln($book->getAuthorAndTitle()); writeln(''); writeln('结束测试命令模式'); function callCommand(BookCommand $bookCommand_in) { $bookCommand_in->execute(); } function writeln($line_in) { echo $line_in.PHP_EOL; } // 我想这个精髓就是,把针对某个类的操作命令,全部放在一个专门的类里面去,调用这个专门的命令类的执行(execute())方法, // 就给需要操作的类执行了相应的命令结果:
开始测试命令模式 创建book之后: Design Patterns by Gamma, Helm, Johnson, and Vlissides book加星标之后: Design*Patterns by Gamma,*Helm,*Johnson,*and*Vlissides book去星标之后: Design Patterns by Gamma, Helm, Johnson, and Vlissides 结束测试命令模式