模板方法模式设计答题问题

1 模式介绍



  定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。


2 模式中的角色



  2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。


  2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。


3 模式结构

模板方法模式设计答题问题_第1张图片


4 项目应用

4.1 需求分析      

 设计一个老师出题目,学生回答的场景。


4.2 类图设计

   


4.3 源码设计

<?php
/**
 * 模板方法模式
 * copyring (c) http://blog.csdn.net/CleverCode
 */


abstract class Exam
{/*{{{*/
    public function question1()    
    {
        echo "1+1=:\r\n";
        echo "答案".$this->answer1()."\r\n";
    }

    public function question2()    
    {
        echo "5*8=:\r\n";
        echo "答案".$this->answer2()."\r\n";
    }

    public function question3()    
    {
        echo "9 - 1=:\r\n";
        echo "答案".$this->answer3()."\r\n";
    }

    abstract public function answer1();
    abstract public function answer2();
    abstract public function answer3();

}/*}}}*/

class StudentA extends Exam
{/*{{{*/
    public function answer1()
    {
        return 2;     
    }

    public function answer2()
    {
       return 40; 
    }

    public function answer3()
    {
       return 8; 
    }
}/*}}}*/

class StudentB extends Exam
{/*{{{*/
    public function answer1()
    {
        return 3;     
    }

    public function answer2()
    {
       return 48; 
    }

    public function answer3()
    {
       return 4; 
    }
}/*}}}*/

function start()
{
    echo "A答题:\r\n";
    $studentA = new StudentA();  
    $studentA->question1(); 
    $studentA->question2(); 
    $studentA->question3(); 
    
    echo "\r\n";
    echo "B答题:\r\n";
    $studentB = new StudentA();  
    $studentB->question1(); 
    $studentB->question2(); 
    $studentB->question3(); 
}

start();

?>


4.4 执行结果



你可能感兴趣的:(模板方法模式设计答题问题)