zoukankan      html  css  js  c++  java
  • 策略模式

    <?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图

  • 相关阅读:
    静态初始化块和main方法哪个先被执行?
    Java中的构造方法
    Java中的局部变量、成员变量和静态变量
    经典算法冒泡排序java版
    Java里数组的三种初始化方式
    聊天,发朋友圈可以不打字,但是表情怎么能少呢?那么如何用win10自带的微软拼音输入法打出表情呢?
    java打印实心10*10正方形, 空心10*10正方形
    安卓工程目录
    (1)开源中国android客户端源码分析
    认识电脑的开机流程与主引导分区(MBR)
  • 原文地址:https://www.cnblogs.com/jsmiao/p/4490787.html
Copyright © 2011-2022 走看看