模板模式(Template Pattern)

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 介绍 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。 何时使用:有一些通用的方法。..


在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

介绍

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

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

何时使用:有一些通用的方法。

如何解决:将这些通用算法抽象出来。

关键代码:在抽象类实现,其他步骤在子类实现。

应用实例:1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点:1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

 

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

角色:
  抽象模板角色:抽象模板类,定义了一个具体的算法流程和一些留给子类必须实现的抽象方法。
  具体子类角色:实现抽象模板类中的抽象方法,子类可以有自己独特的实现形式,但是执行流程受抽象模板类控制。

UML图:

   

 

 

适用性:
  1、完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时。我们通常考虑用模板模式来处理。
  2、当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
  3、模板模式通过把不变的行为搬移到超级抽象类,去除子类中的重复代码来体现它的优势。模板模式提供了一个很好的代码复用平台。

 

代码实现:

复制代码
<?php
//抽象模板类:
abstract class makeComputer{
     private $type;
     function __construct($type){
         $this->type = $type;
     }
     function procedure(){
         $this->prepareScreen();  
         $this->prepareMainboard();
         $this->prepareCPU();
         $this->prepareMemoryBank();
     }
     abstract function prepareScreen();
     abstract function prepareMainboard();
     abstract function prepareCPU();
     abstract function prepareMemoryBank();
}

class makeLenovoComputer extends makeComputer{
     function __construct($type='联想')  {  
        parent::__construct($type);  
    }  
    function prepareScreen(){
        echo "联想屏幕准备完毕";
    }
    function prepareMainboard(){
        echo "联想主板准备完毕";
    }
    function prepareCPU(){
        echo "联想CPU准备完毕";
    }
    function prepareMemoryBank(){
        echo "联想内存条准备完毕";
    }
}

class makeAsusComputer extends makeComputer{
    function __construct($type='华硕')  {  
        parent::__construct($type);  
    }  
    function prepareScreen(){
        echo "华硕屏幕准备完毕";
    }
    function prepareMainboard(){
        echo "华硕主板准备完毕";
    }
    function prepareCPU(){
        echo "华硕CPU准备完毕";
    }
    function prepareMemoryBank(){
        echo "华硕内存条准备完毕";
    }
}

//测试
$lenovoComputer = new makeLenovoComputer();
$lenovoComputer->procedure();
 ?>
复制代码

 

延伸:

   对自己程序内部顺序处理,或者对有特殊逻辑或特殊顺序结构做一个封装或合并,输出一个统一的对外的方法

   降低组件与组件,模块与模块直接的耦合度

  

class Action{
public function handle(){
$this->handle1();
$this->handle2();
$this->handle3();
}

public function handle1(){
echo 11;
}

public function handle2(){
echo 22;
}

public function handle3(){
echo 33;
}
}

$test = new Action();
$test->handle();
 
posted @ 2020-03-02 16:41  笨笨韩  阅读(368)  评论(3)    收藏  举报