博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP设计模式学习笔记: 策略模式
阅读量:5864 次
发布时间:2019-06-19

本文共 2697 字,大约阅读时间需要 8 分钟。

  hot3.png

// 策略生成器(有点相当于工厂)class StrategyContext {    private $strategy = NULL;     //bookList is not instantiated at construct time    public function __construct($strategy_ind_id) {        switch ($strategy_ind_id) {            case "Makeupper":                 $this->strategy = new StrategyMakeupper();            break;            case "Makeimportant":                 $this->strategy = new StrategyMakeimportant();            break;            case "Makefavorate":                 $this->strategy = new StrategyMakefavorate();            break;        }    }    public function showBookTitle($book) {      return $this->strategy->showTitle($book);    }}// 定义一个策略接口,让所有实现该接口的策略类都保持有showTitle()这个规范的方法interface StrategyInterface {    public function showTitle($book_in);}class StrategyMakeupper implements StrategyInterface {    public function showTitle($book_in) {        $title = $book_in->getTitle();        return strtoupper($title);    }}class StrategyMakeimportant implements StrategyInterface {    public function showTitle($book_in) {        $title = $book_in->getTitle();        return str_replace(' ','!',$title);    }}class StrategyMakefavorate implements StrategyInterface {    public function showTitle($book_in) {        $title = $book_in->getTitle();        return str_replace(' ','*',$title);    }}class Book {    private $author;    private $title;    function __construct($title_in, $author_in) {        $this->author = $author_in;        $this->title  = $title_in;    }    function getAuthor() {        return $this->author;    }    function getTitle() {        return $this->title;    }    function getAuthorAndTitle() {        return $this->getTitle() . ' by ' . $this->getAuthor();    }}  writeln('开始测试策略模式');  writeln('');  $book = new Book('这是书名标题《abc》  ^o^');   // 给策略生成器工厂传递一个策略参数,就得到了不同的策略对象  $strategyContextMakeupper = new StrategyContext('Makeupper');  $strategyContextMakeimportant = new StrategyContext('Makeimportant');  $strategyContextMakefavorate = new StrategyContext('Makefavorate');   writeln('测试 1 - 显示大写后的书名');  // 调用策略对象的方法都是一样的( showBookTitle() ),给其传递的参数也是一样的($book)  // 但因为策略对象不一样,所以结果不一样。对象不同,结果不同,结果不同的根本原因在于传递了不同的“策略参数”  writeln($strategyContextMakeupper->showBookTitle($book));  writeln('');  writeln('测试 2 - 显示标识为重要的书名');  writeln($strategyContextMakeimportant->showBookTitle($book));  writeln('');   writeln('测试 3 - 显示标识为收藏的书名');  writeln($strategyContextMakefavorate->showBookTitle($book));  writeln('');  writeln('结束测试策略模式');  function writeln($line_in) {    echo $line_in.PHP_EOL;  }

结果:

开始测试策略模式测试 1 - 显示大写后的书名这是书名标题《ABC》  ^O^测试 2 - 显示标识为重要的书名这是书名标题《abc》!!^o^测试 3 - 显示标识为收藏的书名这是书名标题《abc》**^o^结束测试策略模式

EOF

转载于:https://my.oschina.net/ecnu/blog/288621

你可能感兴趣的文章
jQuery post数据至ashx
查看>>
iOS - App 上架审核被原因拒总结
查看>>
[APUE]标准IO库(下)
查看>>
JS框架设计之模块加载系统
查看>>
CSDN-Code平台公钥设置
查看>>
菜鸟之路-浅谈设计模式之观察者模式
查看>>
HTML5 Canvas 绘制澳大利亚国旗
查看>>
Unity中的定时器与延时器
查看>>
python自动安装mysql5.7
查看>>
为什么需要批判性思维 -- 读《学会提问》
查看>>
阿隆佐·丘奇与λ演算系统
查看>>
技术的道与术
查看>>
【转】单片机为什么叫单片机
查看>>
mysql 0x80004005 unable to connect to any of the specified mysql hosts
查看>>
事务隔离级别
查看>>
ComputeShader中Consume与AppendStructuredBuffer的使用
查看>>
如何让两个文件的两个类相互关联
查看>>
ArcGIS Python编程案例-电子资料链接
查看>>
Web Service概念梳理
查看>>
Android开源代码解读のOnScrollListener实现ListActivity滚屏首字母提示
查看>>