PHP中如何深入理解策略、适配器及观察者模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计830个文字,预计阅读时间需要4分钟。
策略模式通过定义一系列算法,将每个算法封装起来,使它们可以相互替代。策略模式为算法族提供了一种管理方法,允许在运行时选择算法,提供可复用的解决方案,避免使用多重条件转移语句。具体实现如下:
phpabstract class Strategy { abstract public function execute();}
class ConcreteStrategyA extends Strategy { public function execute() { // 实现算法A }}
class ConcreteStrategyB extends Strategy { public function execute() { // 实现算法B }}
class Context { private $strategy;
public function __construct(Strategy $strategy) { $this->strategy=$strategy; }
public function setStrategy(Strategy $strategy) { $this->strategy=$strategy; }
public function executeStrategy() { $this->strategy->execute(); }}
// 使用策略模式$context=new Context(new ConcreteStrategyA());$context->executeStrategy();
$context->setStrategy(new ConcreteStrategyB());$context->executeStrategy();以上代码展示了策略模式的基本实现。其中,`Strategy` 是抽象策略类,定义了算法的执行接口;`ConcreteStrategyA` 和 `ConcreteStrategyB` 是具体策略类,实现了不同的算法;`Context` 是环境类,持有一个策略对象的引用,并负责执行策略。通过设置不同的具体策略,可以实现算法之间的替换。
策略模式
特点
定义一系列算法封装起来, 让他们可以相互替代,策略模式提供了管理相关算法族的办法, 提供了可以体会继承关系的棒法, 避免使用多重条件转移语句
实现
<?php abstract class Strategy { abstract function goSchool(); } class Run extends Strategy { public function goSchool() { echo "走路去学校"; } } class Subway extends Strategy { public function goSchool() { echo "地铁去学校"; } } class Bike extends Strategy { public function goSchool() { echo "公交去学校"; } } class GoSchoolContext { protected $_stratege; public function __construct($stratege) { $this->_stratege = $stratege; } public function goSchool() { $this->_stratege->goSchool(); } } $traget = new Run(); $obj = new GoSchoolContext($traget); $obj->goSchool();
适配器模式
特点
需要的东西在面前,但却不能用,而短时间又无法改造它,于是就想办法适配
实现
// 适配器 interface Charget { public function putCharget(); } class China implements Charget { private $v = 220; public function putCharget() { return $this->v; } } class Adper extends China { public function putCharget() { return parent::putCharget() / 2 + 10; } } class Phone { public function charge(Charget $charge) { if ($charge->putCharget() != "120") { echo "不能充电"; } else { echo "能充电"; } } } $china = new China(); $adper = new Adper(); $phone = new Phone(); $phone->charge($adper);
观察者模式
特点
当一个对象状态发生变化时, 依赖他的对象全部收到通知, 并主动更新。观察者模式实现了低耦合, 非侵入式的通知与更新机制。
实现
<?php // 主题接口 interface Subject { public function register(Observer $observer); } // 观察者接口 interface Observer { public function watch(); } // 主题 class WatchAction implements Subject { public $_observers = []; public function register(\Observer $observer) { $this->_observers[] = $observer; } public function notify() { foreach($this->_observers as $object) { $object->watch(); } } } // 观察者 class Cat1 implements Observer{ public function watch(){ echo "Cat1 watches TV<hr/>"; } } class Dog1 implements Observer{ public function watch(){ echo "Dog1 watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } } $action = new WatchAction(); $action->register(new Cat1()); $action->register(new People()); $action->register(new Dog1()); $action->notify();
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注自由互联的更多内容!
本文共计830个文字,预计阅读时间需要4分钟。
策略模式通过定义一系列算法,将每个算法封装起来,使它们可以相互替代。策略模式为算法族提供了一种管理方法,允许在运行时选择算法,提供可复用的解决方案,避免使用多重条件转移语句。具体实现如下:
phpabstract class Strategy { abstract public function execute();}
class ConcreteStrategyA extends Strategy { public function execute() { // 实现算法A }}
class ConcreteStrategyB extends Strategy { public function execute() { // 实现算法B }}
class Context { private $strategy;
public function __construct(Strategy $strategy) { $this->strategy=$strategy; }
public function setStrategy(Strategy $strategy) { $this->strategy=$strategy; }
public function executeStrategy() { $this->strategy->execute(); }}
// 使用策略模式$context=new Context(new ConcreteStrategyA());$context->executeStrategy();
$context->setStrategy(new ConcreteStrategyB());$context->executeStrategy();以上代码展示了策略模式的基本实现。其中,`Strategy` 是抽象策略类,定义了算法的执行接口;`ConcreteStrategyA` 和 `ConcreteStrategyB` 是具体策略类,实现了不同的算法;`Context` 是环境类,持有一个策略对象的引用,并负责执行策略。通过设置不同的具体策略,可以实现算法之间的替换。
策略模式
特点
定义一系列算法封装起来, 让他们可以相互替代,策略模式提供了管理相关算法族的办法, 提供了可以体会继承关系的棒法, 避免使用多重条件转移语句
实现
<?php abstract class Strategy { abstract function goSchool(); } class Run extends Strategy { public function goSchool() { echo "走路去学校"; } } class Subway extends Strategy { public function goSchool() { echo "地铁去学校"; } } class Bike extends Strategy { public function goSchool() { echo "公交去学校"; } } class GoSchoolContext { protected $_stratege; public function __construct($stratege) { $this->_stratege = $stratege; } public function goSchool() { $this->_stratege->goSchool(); } } $traget = new Run(); $obj = new GoSchoolContext($traget); $obj->goSchool();
适配器模式
特点
需要的东西在面前,但却不能用,而短时间又无法改造它,于是就想办法适配
实现
// 适配器 interface Charget { public function putCharget(); } class China implements Charget { private $v = 220; public function putCharget() { return $this->v; } } class Adper extends China { public function putCharget() { return parent::putCharget() / 2 + 10; } } class Phone { public function charge(Charget $charge) { if ($charge->putCharget() != "120") { echo "不能充电"; } else { echo "能充电"; } } } $china = new China(); $adper = new Adper(); $phone = new Phone(); $phone->charge($adper);
观察者模式
特点
当一个对象状态发生变化时, 依赖他的对象全部收到通知, 并主动更新。观察者模式实现了低耦合, 非侵入式的通知与更新机制。
实现
<?php // 主题接口 interface Subject { public function register(Observer $observer); } // 观察者接口 interface Observer { public function watch(); } // 主题 class WatchAction implements Subject { public $_observers = []; public function register(\Observer $observer) { $this->_observers[] = $observer; } public function notify() { foreach($this->_observers as $object) { $object->watch(); } } } // 观察者 class Cat1 implements Observer{ public function watch(){ echo "Cat1 watches TV<hr/>"; } } class Dog1 implements Observer{ public function watch(){ echo "Dog1 watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } } $action = new WatchAction(); $action->register(new Cat1()); $action->register(new People()); $action->register(new Dog1()); $action->notify();
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注自由互联的更多内容!

