标签:设计模式 模版方法模式
<?php /** * 3.6 模版方法模式 * 定义: * 定义一个操作中的算法的骨架,而将一些步骤延 * 迟到子类中。模版方法是的子类可以不改变一个 * 算法的结构即可重定义该算法的某些特定步骤。 * 角色: * 1. 抽象模版方法类 * 职责:定义并实现了一个模版方法。这个模 * 版方法一般是一个具体方法,它给出 * 了一个顶级逻辑的骨架,而逻辑的组 * 成步骤在相应的抽象操作中,推迟到 * 子类实现。顶级逻辑也有可能调用一 * 些具体方法。 * 2. 具体类 * 职责:实现父类定义的一个或多个抽象方法 * 。每一个抽象模版方法类都可以有任 * 意多个具体类与之对应,而每一个具 * 体类都可以给出这些抽象方法(也就 * 是顶级逻辑的组成步骤)的不同实现 * ,从而使得顶级逻辑的实现各不相同。 * * 优点: * 1. 此模式在定义了一组算法,将具体的实现交友 * 子类负责。 * 2. 复用了代码 * 3. 导致了一种反向的控制结构,通过一个父类调 * 用子类的操作,通过对子类的扩展增加自己新 * 的行为,符合开闭原则。 * 缺点: * 1. 每个一个不同的实现都需要一个子类来实现, * 导致类的个数增加,加大了系统的复杂度。 * * 使用场景: * 1. 一次性实现一个算法的不变的部分,并将可变 * 的行为留给子类来实现。 * 2. 个子类中公共的行为应被提取出来并集中到一 * 个公共父类中以避免代码重复。首先识别现有 * 代码中的不同之处,并且将不同之处分离为新 * 的操作。最后,用一个调用这些新的操作的模 * 版方法来替换这些不同的代码。 * 3. 控制子类扩展。模版方法只在特定点调用“hook” * 操作,这样就只允许在这些点进行扩展。 * * */ //抽象模版类 abstract class AbstractClass{ //子类中不同的代码,在父类中使用抽象方法让子类 //重写。 abstract public function PrimitiveOperation1(); abstract public function PrimitiveOperation2(); //子类重复的代码都在此模版方法中来实现 public function TemplateMethod(){ $this->PrimitiveOperation1(); $this->PrimitiveOperation2(); echo ‘‘; } } //具体模版类 class ConcreteClassA extends AbstractClass{ public function PrimitiveOperation1(){ echo ‘具体类A,方法的1的实现;‘; } public function PrimitiveOperation2(){ echo ‘具体类A,方法的2的实现;‘; } } class ConcreteClassB extends AbstractClass{ public function PrimitiveOperation1(){ echo ‘具体类B,方法的1的实现;‘; } public function PrimitiveOperation2(){ echo ‘具体类B,方法的2的实现;‘; } } //客户端 $c=new ConcreteClassA(); $c->TemplateMethod(); $c=new ConcreteClassB(); $c->TemplateMethod(); ?>
本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614789
标签:设计模式 模版方法模式
原文地址:http://noican.blog.51cto.com/4081966/1614789