模板方法

 

 

意图:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

适用性:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n 所描述过的“重分解以一般化”的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。模板方法只在特定点调用“h o o k ”操作(参见效果一节),这样就只允许在这些点进行扩展。

模板方法模式所涉及到得角色:

抽象模版角色:定义了一个或多个抽象操作以便让子类实现,这些抽象操作叫做基本操作,他们是一个顶级逻辑的组成步骤,定义并实现一个模版方法,这个模版方法就是一个具体方法,他给出了一个顶级逻辑的骨架,而逻辑的实现在相应的抽象操作中,推迟到子类中去实现。
具体模版角色:实现父类中定义的一个或多个抽象方法,他们是一个顶级逻辑的组成部分,不同的具体模版都可以给出这些抽象方法的实现,从而使得顶级逻辑的实现各不相同

 

/* Fish.java*/

package cn.by.DesignModel.TemplateMethod;

/**
 *
 *抽象模板类
 */
abstract class Fish {

 /**
  * 模板方法
  */
 void oneDay() {
  swim();
  eat();
  sleep();
 }
   
 //已实现方法
 void swim() {
  System.out.println("I am swimming!!!!");
 }

 void eat() {
  System.out.println("I am eat grass");
 }
    //各子类不同的方法
 abstract void sleep();

}
 

 

/* GrassFish.java*/

package cn.by.DesignModel.TemplateMethod;

/**
 *
 *具体子类
 */
public class GrassFish extends Fish{
 void sleep() {
  System.out.println("I sleep at pond(池塘)");
 }

}
 

 

 

/*SharkFish.java*/

package cn.by.DesignModel.TemplateMethod;

/**
 *
 *具体子类
 */
 class SharkFish extends Fish {
 
 void sleep() {
  System.out.println("I sleep at ocean!!!!!!");
 }

}
 

你可能感兴趣的:(设计模式,职场,休闲)