工作生活

设计模式(十一)模板方法模式-封装算法

2019-07-02  本文已影响0人  天色将变
定义

模板方法模式在一个方法中定义类一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

解释

甲打开了一个app,买了一张汽车票,乘坐汽车,到了泰山。
乙打开了一个app,买了一张船票,乘船,到了泰山。
丙打开了一个app,买了一张机票,乘坐飞机,到了泰山。
骨架:某人,打开了一个app,买了xx,乘坐xx,到了泰山。
子类:甲乙丙提供部分算法的具体实现。

类图
image.png
伪代码
public abstract class Travel{
  public final void travel(){// 算法步骤
    openApp();
    buyTicket();
    takeVehicle();
    to();
  }
  pulbic final void openApp(){// 限定只能打开指定的app   子类不能覆盖
    System.out.println("open app");
  }
  public abstract void buyTicket();//子类实现
  public abstract void takeVehicle();//子类实现
  public final void to(){
    System.out.println("to 泰山");
  }
}
public class 甲 extends Travel{
  public void buyTicket(){ // 子类实现
    System.out.println("buy car tickey");
  }
 public void takeVehicle(){// 子类实现
    System.out.println("take car);
  }
}
public class 乙 extends Travel{
  public void buyTicket(){ // 子类实现
    System.out.println("buy ship tickey");
  }
 public void takeVehicle(){// 子类实现
    System.out.println("take ship);
  }
}

示例:

Travel travel = new 甲();
travel.travel();

travel = new 乙();
travel.travel();
描述
模板方法中的钩子

钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,有子类自行决定。
钩子其实也是算法步骤中的一个步骤,只是有些特殊,用于控制作用。

钩子伪代码
public abstract class Travel{
  public final void travel(){// 算法步骤
    openApp();
    if(isGoodWeather()){// 好天气才出行
      buyTicket();
      takeVehicle();
      to();
    }
  }
  pulbic final void openApp(){// 限定只能打开指定的app   子类不能覆盖
    System.out.println("open app");
  }
  public abstract void buyTicket();//子类实现
  public abstract void takeVehicle();//子类实现
  public final void to(){
    System.out.println("to 泰山");
  }
  public boolean isGoodWeather(){//钩子方法,默认好天气
    return true;
  }
}
public class 甲 extends Travel{
  public void buyTicket(){ // 子类实现
    System.out.println("buy car tickey");
  }
 public void takeVehicle(){// 子类实现
    System.out.println("take car);
  }
 public void isGoodWeather(){
    return false;
  }
}
public class 乙 extends Travel{
  public void buyTicket(){ // 子类实现
    System.out.println("buy ship tickey");
  }
 public void takeVehicle(){// 子类实现
    System.out.println("take ship);
  }
}

示例:

Travel travel = new 甲();
travel.travel();// 甲的天气不好,不能出行

travel = new 乙();
travel.travel();// 乙的天气好,能出行
哪些方法需要定义为抽象方法
模板方法与策略模式的却别
总结
上一篇 下一篇

猜你喜欢

热点阅读