php设计模式之模板模式Template

时间:2017-07-27
模板方法模式又叫模板模式,该模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,本文章向大家详细介绍php设计模式之模板模式Template,需要的朋友可以参考一下。

1、模式定义

模板模式准备一个抽象类,将部分逻辑以具体方法以及具体构造形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。这一点,在下面的举例中可以很明显的看出来。

2.UML类图

php设计模式之模板模式Template

3.角色   

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

4.示例代码

<?php
	/**
	* 模板模式
	*
   	* 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤
   	*
   	*/
	abstract class TemplateBase
  	{
		public function Method1()
		{
			echo "abstract Method <br/>";
		}

		public function Method2()
		{
			echo "abstract Method2<br/>";
		}

		public function Method3()
		{
			echo "abstract Method3<br/>";
		}
	
		public function doSomeThing()
		{
	  		$this->Method1();
			$this->Method2();
	        $this->Method3();
		}
	}
	
	class TemplateObject extends TemplateBase
	{
	}
	
	class TemplateObject1 extends TemplateBase
	{
		public function Method3()
		{
			echo "TemplateObject1 Method3<br/>";
		}
	}
 
 	class TemplateObject2 extends TemplateBase
 	{
		public function Method2()
     	{	
			echo "TemplateObject2 Method2<br/>";
	}
}
	
	// 实例化
 	$objTemplate = new TemplateObject();
 	$objTemplate1 = new TemplateObject1();
 	$objTemplate2 = new TemplateObject2();
 
 	$objTemplate->doSomeThing();
	echo '<br />';
 	$objTemplate1->doSomeThing();
	echo '<br />';
	$objTemplate2->doSomeThing();
?>

程序运行结果:

abstract Method1
abstract Method2
abstract Method3

abstract Method1
abstract Method2
TemplateObject1 Method3

abstract Method1
TemplateObject2 Method2
abstract Method3

AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。

ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

5.适用场景及优势

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