策略模式


<?php
//策略模式
abstract class Lesson {
private $_num; //课程购买人数
private $_strategy; //策略属性字段,保存具体策略角色对象的引用,例如English对象或者Math对象
public function __construct($_num, $_strategy) {
$this->_num = $_num;
$this->_strategy = $_strategy;
}
public function __get($key) {
return $this->$key;
}

public function cost() { //返回具体策略角色课程所需的费用
return $this->_strategy->cost($this);
}
public function type() { //返回具体策略角色购买的
return $this->_strategy->type($this);
}
}
//文科学院类
class Arts extends Lesson {
protected $_discount = 0.85; //父类对象访问子类属性
protected $_type = '文科';
}
//理科学院类
class Science extends Lesson {
protected $_discount = 0.75;
protected $_type = '理科';
}
//具体课程抽象类
abstract class L {
abstract public function cost(Lesson $_lesson);
abstract public function type(Lesson $_lesson);
}
//英语课程类
class English extends L {
public function cost(Lesson $_lesson) { //父类对象访问子类属性
return $_lesson->_discount * 300 * $_lesson->_num;
}
public function type(Lesson $_lesson) {
return '您购买的是'.$_lesson->_type.'英语课程!';
}
}
//数学课程类
class Math extends L {
public function cost(Lesson $_lesson) {
return $_lesson->_discount * 180 * $_lesson->_num;
}
public function type(Lesson $_lesson) {
return '您购买的是'.$_lesson->_type.'数学课程!';
}
}

$_arts = new Arts(5,new English());
echo $_arts->type().$_arts->cost();

?>

通过组合具体的课程类和学院类,从而实现了不同学院相同课程的差异化,比如文科英语,理科英语,文科数学,理科数学。

要增加学院,只需要要增加具体的学院类,要增加课程,只需要增加具体的课程,从而易于扩展,实现了高内聚,低耦合。

既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。

策略模式UML图

继承模式UML图

优质内容筛选与推荐>>
1、RDO安装openstack遇到的一些问题(swift&mongodb)
2、WinForm中如何判断关闭事件来源于用户点击右上角的“关闭”按钮
3、Android之属性动画Animator
4、学习SVM(二)如何理解支持向量机的最大分类间隔
5、android开发列表界面


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号