博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:6495 次
发布时间:2019-06-24

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

原文链接:

解释:

    策略模式帮助构建的对象不必包含本身的逻辑,而是能够根据需要利用其他对象中的算法。

 

需求:

    我们本来有一个CD类:

class CD{	private $title;	private $band;	public function __construct($title , $band) {		$this->title = $title;		$this->band = $band;	}	public function getAsXml(){		$doc = new \DOMDocument();		$root = $doc->createElement('cd');		$root = $doc->appendChild($root);		$title = $doc->createElement('title' , $this->title);		$title = $root->appendChild($title);		$band = $doc->createElement('band' , $this->band);		$band = $root->appendChild($band);		return $doc->saveXML();	}}

    后来我们想让CD以JSON格式输出,这时可以直接加入一个getAsJson()方法,但是后期我们可能还会让CD以其他各种各样的方式输入,这个CD最后会变得十分臃肿存在很多实例不会调用的方法。这时就可以从类中取出这些方法将其添加到只在需要时创建的具体类中。

    

代码:

    首先设计一个接口在这个接口里规定要实现方法:

namespace Strategy;interface ShowStrategy{	function show(CDStrategy $cd);}

    然后是XML类:

namespace Strategy;class CDAsXMLStrategy implements ShowStrategy{	public function show(CDStrategy $cd) {		$doc = new \DOMDocument();		$root = $doc->createElement('cd');		$root = $doc->appendChild($root);		$title = $doc->createElement('title' , $cd->title);		$title = $root->appendChild($title);		$band = $doc->createElement('band' , $cd->band);		$band = $root->appendChild($band);		return $doc->saveXML();	}}

    接着是JSON类:

namespace Strategy;class CDAsJSONStrategy implements ShowStrategy{	public function show(CDStrategy $cd) {		$json = [];		$json['cd']['title'] = $cd->title;		$json['cd']['band'] = $cd->band;		return json_encode($json);	}}

    然后是应用策略模式后的CD类:

namespace Strategy;class CDStrategy{	public $title;	public $band;	protected $_strategy;	public function __construct($title , $band) {		$this->title = $title;		$this->band = $band;	}	public function setStrategyContext(ShowStrategy $strategy) {		$this->_strategy = $strategy;	}	public function get() {		return $this->_strategy->show($this);	}}

    最后是App.php测试下:

require 'CDStrategy.php';require 'ShowStrategy.php';require 'CDAsXMLStrategy.php';require 'CDAsJSONStrategy.php';$cd = new Strategy\CDStrategy('what?' , 'Simple Plan');$xml = new Strategy\CDAsXMLStrategy();$cd->setStrategyContext($xml);echo $cd->get();echo '
';$json = new Strategy\CDAsJSONStrategy();$cd->setStrategyContext($json);echo $cd->get();

 

转载于:https://www.cnblogs.com/orlion/p/5350897.html

你可能感兴趣的文章
poj 3321 Apple Tree
查看>>
【转】 LDA必读的资料
查看>>
百度重置页面自动跳转脚本
查看>>
Unity3D常用代码总结
查看>>
Ubuntu 13.10 安装Terminalx 后更改默认终端设置
查看>>
js中document.write的那点事
查看>>
【WP8】ResourceDictionary
查看>>
Lambda表达式可以被转换为委托类型
查看>>
理解正向索引
查看>>
xp/2003开关3389指令
查看>>
Oracle中merge into的使用
查看>>
iOS 设置UILabel 的内边距
查看>>
Android ViewPager使用具体解释
查看>>
php 命中算法
查看>>
Effective Java - Item 1: Consider static factory methods instead of constructors
查看>>
Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法
查看>>
c基础知识复习
查看>>
如何彻底卸载mysql(xp)
查看>>
.net反射详解(转)
查看>>
使用jquery.more.js来实现点击底部更多后, 底部加载出新的数据
查看>>