目录

解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1…n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。

代码示例

<?php


/**
 * Description of TemplateDemo
 * 模板模式
 * @author jm
 */
class TemplateDemo
{
    //put your code here
    public static function main()
    {
        echo "学生A答题: \n";
        $student = new TestPaperA();
        $student->TestQuestion1();
        $student->TestQuestion2();
        $student->TestQuestion3();
        echo "学生B答题: \n";
        $student2 = new TestPaperB();
        $student2->TestQuestion1();
        $student2->TestQuestion2();
        $student2->TestQuestion3();        
    }
       
}

class TestPaper
{
    public function TestQuestion1()
    {
        echo "以下英雄在王者荣耀中哪个是法师[]a.程咬金 b.马超 c.妲己 d.叶灵儿 \n";
        echo "答案 ".$this->answer1()."\n";
    }

    public function TestQuestion2()
    {
        echo "以下英雄在王者荣耀中哪个是辅助[]a.猪八戒 b.孙悟空 c.沙僧 d.瑶 \n";
        echo "答案 ".$this->answer2()."\n";
    }

    public function TestQuestion3()
    {
        echo "以下英雄在王者荣耀中哪个是射手[]a.曹操 b.刘备 c.孙策 d.孙尚香 e.大乔 \n";
        echo "答案 ".$this->answer3()."\n";
    }

    protected function answer1()
    {
        return '';
    }

    protected function answer2()
    {
        return '';
    }

    protected function answer3()
    {
        return '';
    }
}

// 学生A答题
class TestPaperA extends TestPaper
{
    protected function answer1()
    {
        return 'a';
    }

    protected function answer2()
    {
        return 'b';
    }

    protected function answer3()
    {
        return 'c';
    } 
}

//学生B答题
class TestPaperB extends TestPaper
{
    protected function answer1()
    {
        return 'd';
    }

    protected function answer2()
    {
        return 'c';
    }

    protected function answer3()
    {
        return 'a';
    } 
}


TemplateDemo::main();

输出

学生A答题: 
以下英雄在王者荣耀中哪个是法师[]a.程咬金 b.马超 c.妲己 d.叶灵儿 
答案 a
以下英雄在王者荣耀中哪个是辅助[]a.猪八戒 b.孙悟空 c.沙僧 d.瑶 
答案 b
以下英雄在王者荣耀中哪个是射手[]a.曹操 b.刘备 c.孙策 d.孙尚香 e.大乔 
答案 c
学生B答题: 
以下英雄在王者荣耀中哪个是法师[]a.程咬金 b.马超 c.妲己 d.叶灵儿 
答案 d
以下英雄在王者荣耀中哪个是辅助[]a.猪八戒 b.孙悟空 c.沙僧 d.瑶 
答案 c
以下英雄在王者荣耀中哪个是射手[]a.曹操 b.刘备 c.孙策 d.孙尚香 e.大乔 
答案 a

小结

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

既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模版,所有重复的代码都应该要上升到父类去,而不是让每个子类去重复。

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其中个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模版方法模式来处理。

模版方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。

当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模版方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。


本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除

markdown @TsingChan