21-策略模式
目录
前面又介绍完了结构行为类型的设计模式,最后要介绍的是关系型设计模式。本篇下介绍常用的策略模式。
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。
需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。
代码示例
<?php
/**
* Description of StrategyDemo
* 策略模式
* @author jm
*/
class StrategyDemo
{
//put your code here
public static function main()
{
$price = 100;
// $discount = new Discount7();//由外部客户端选择策略,不论什么策略都提供最终计算价格
$discount = new DiscountFactory(7);//结合工厂
echo "原价:".$price.",最终价格:".$discount->count($price)."\n";
}
}
interface IDiscount{
public function count($price);
}
class Discount9 implements IDiscount{
public function count($price){
return $price * 0.9;
}
}
class Discount7 implements IDiscount{
public function count($price){
return $price * 0.7;
}
}
class Discount5 implements IDiscount{
public function count($price){
return $price * 0.5;
}
}
class DiscountFactory{
private $_discount = null;
public function __construct($discountInt)
{
switch ($discountInt) {
case 5:
$this->_discount = new Discount5();
break;
case 7:
$this->_discount = new Discount7();
break;
case 9:
$this->_discount = new Discount9();
break;
default:
return null;
}
}
public function count($price){
return $this->_discount->count($price);
}
}
StrategyDemo::main();
输出:
原价:100,最终价格:70
小结
策略模式的决定权在用户,系统本身提供不同算法的实现,比如打折算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。
面向对象的编程,并不是类越多越好,类的划分为了封装,但分类的基础是抽象,具有相同属性和功能的对象集合才是类。
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除
markdown 9ong@TsingChan