模板方法模式是一种行为型设计模式。它定义了一个操作中的算法框架,将某些步骤放在子类中实现。这样可以让子类在不改变算法框架的情况下,重新定义算法中的某些步骤。
模板方法模式中通常有两个主要角色:
- 抽象类(Abstract Class):定义了算法中的关键步骤,其中某些步骤由子类实现。
- 具体子类(Concrete Class):实现了抽象类定义的某些步骤。
使用模板方法模式的一个典型场景是在多个类中实现某些共同的方法,但每个类又有一些特定的实现。在这种情况下,可以将这些共同的方法抽象到一个基类中,让每个子类只需实现自己的特定实现即可。
golang实现代码:
// 抽象类
type AbstractClass interface {
TemplateMethod()
PrimitiveOperation1()
PrimitiveOperation2()
}
// 具体子类 1
type ConcreteClass1 struct{}
func (c *ConcreteClass1) TemplateMethod() {
c.PrimitiveOperation1()
c.PrimitiveOperation2()
}
func (c *ConcreteClass1) PrimitiveOperation1() {
fmt.Println("ConcreteClass1: PrimitiveOperation1")
}
func (c *ConcreteClass1) PrimitiveOperation2() {
fmt.Println("ConcreteClass1: PrimitiveOperation2")
}
// 具体子类 2
type ConcreteClass2 struct{}
func (c *ConcreteClass2) TemplateMethod() {
c.PrimitiveOperation1()
c.PrimitiveOperation2()
}
func (c *ConcreteClass2) PrimitiveOperation1() {
fmt.Println("ConcreteClass2: PrimitiveOperation1")
}
func (c *ConcreteClass2) PrimitiveOperation2() {
fmt.Println("ConcreteClass2: PrimitiveOperation2")
}
// 测试代码
abstractClass := &ConcreteClass1{}
abstractClass.TemplateMethod() // Output: ConcreteClass1: PrimitiveOperation1 \n ConcreteClass1: PrimitiveOperation2
abstractClass = &ConcreteClass2{}
abstractClass.TemplateMethod() // Output: ConcreteClass2: PrimitiveOperation1 \n ConcreteClass2: PrimitiveOperation2
php实现代码:
// 抽象类
abstract class AbstractClass {
public function templateMethod() {
$this->primitiveOperation1();
$this->primitiveOperation2();
}
abstract protected function primitiveOperation1();
abstract protected function primitiveOperation2();
}
// 具体子类
class ConcreteClass1 extends AbstractClass {
protected function primitiveOperation1() {
echo "ConcreteClass1: primitiveOperation1<br>";
}
protected function primitiveOperation2() {
echo "ConcreteClass1: primitiveOperation2<br>";
}
}
class ConcreteClass2 extends AbstractClass {
protected function primitiveOperation1() {
echo "ConcreteClass2: primitiveOperation1<br>";
}
protected function primitiveOperation2() {
echo "ConcreteClass2: primitiveOperation2<br>";
}
}
// 测试代码
$abstractClass = new ConcreteClass1();
$abstractClass->templateMethod(); // Output: ConcreteClass1: primitiveOperation1<br>ConcreteClass1: primitiveOperation2<br>
$abstractClass = new ConcreteClass2();
$abstractClass->templateMethod(); // Output: ConcreteClass2: primitiveOperation1<br>ConcreteClass2: primitiveOperation2<br>
AbstractClass
是一个抽象类,它定义了一个 TemplateMethod()
模板方法和两个抽象方法 PrimitiveOperation1()
和 PrimitiveOperation2()
,这些抽象方法由具体子类实现。ConcreteClass1
和 ConcreteClass2
是两个具体子类,它们分别实现了 PrimitiveOperation1()
和 PrimitiveOperation2()
方法。
在测试代码中,通过调用 TemplateMethod()
方法来执行算法。在执行过程中,会自动调用再子类中实现的抽象方法。这里演示了不同具体子类实现算法的不同输出情况。