设计模式--模板模式
设计模式--模板模式
模板模型原理
泡咖啡与泡茶的算法
泡咖啡步骤: 泡茶步骤:
水烧开 水烧开
冲泡咖啡粉 冲泡茶叶
把咖啡倒入杯子 把茶水倒入杯子
加糖和牛奶 加柠檬
思考 变化与不变化
代码讲解
Coffee
public class Coffee {
public void prepareRecipe() {
boilWater();
brewCoffee();
pourInCup();
addSugarMilk();
}
public void boilWater(){
System.out.println("boilWater");
}
public void brewCoffee(){
System.out.println("brewCoffee");
}
public void pourInCup(){
System.out.println("pourInCup");
}
public void addSugarMilk(){
System.out.println("addSugarMilk");
}
}
Tea
public class Tea {
public void prepareRecipe() {
boilWater();
brewTea();
pourInCup();
addLemon();
}
public void boilWater(){
System.out.println("boilWater");
}
public void brewTea(){
System.out.println("brewTea");
}
public void pourInCup(){
System.out.println("pourInCup");
}
public void addLemon(){
System.out.println("addLemon");
}
}
MainTest
public class MainTest {
public static void main(String[] args) {
Coffee mCoffee = new Coffee();
Tea mTea = new Tea();
mCoffee.prepareRecipe();
mTea.prepareRecipe();
}
}
抽象冲泡算法
HotDrink
public abstract class HotDrink {
public abstract void prepareRecipe();
public void boilWater() {
System.out.println("boilWater");
}
public void pourInCup() {
System.out.println("pourInCup");
}
}
模板模式的原理和设计
模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现。模板模式可以使子类在不改变算法结构的
情况下,重新定义算法中的某些步骤
代码讲解
HotDrink
public abstract class HotDrink {
public final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
public final void boilWater() {
System.out.println("boilWater");
}
public final void pourInCup() {
System.out.println("pourInCup");
}
public abstract void brew();
public abstract void addCondiments();
}
Coffee
public class Coffee extends HotDrink{
public void brew() {
System.out.println("brewing coffee");
}
public void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
MainTest
public class MainTest {
public static void main(String[] args) {
HotDrink mCoffee = new Coffee();
HotDrink mTea = new Tea();
mCoffee.prepareRecipe();
mTea.prepareRecipe();
}
}
hook()方法可以重写,也可以选择不重写
HotDrink
public abstract class HotDrink {
public final void prepareRecipe() {
boilWater();
pourInCup();
brew();
if(wantCondimentsHook()) {
addCondimentsHook();
}else {
System.out.println("No Condiments");
}
}
public boolean wantCondimentsHook() {
return true;
}
public final void boilWater() {
System.out.println("boilWater");
}
public final void pourInCup() {
System.out.println("pourInCup");
}
public abstract void brew();
public abstract void addCondimentsHook();
}
TeaWithHook
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TeaWithHook extends HotDrink{
public boolean wantCondimentsHook() {
System.out.println("Cndiments, yes or no?please input(y/n):");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String result = "";
try {
result = in.readLine();
}catch(IOException e) {
e.printStackTrace();
}
if(result.equals("n")){
return false;
}else {
return true;
}
}
@Override
public void brew() {
System.out.println("brew Tea");
}
@Override
public void addCondiments() {
System.out.println("adding lemon");
}
}
身边模板模式
排序鸭子
数组内置的sort版本
Comparable版本
Duck
public class Duck implements Comparable{
String name = "";
int weight = 1;
public Duck(String name, int weight) {
this.name = name;
this.weight = weight;
}
public String toString() {
return name + "weight:" + weight;
}
public int compareTo(Object arg0) {
Duck buf = (Duck)arg0;
if(this.weight > buf.weight) {
return 1;
}else if(this.weight < buf.weight) {
return -1;
}
return 0;
}
}
进行排序
Duck[] ducks = new Duck[10];
for(int i = 0; i < 10; i++) {
ducks[i] = new Duck();
//添加数据
}
Arrays.sort(duck);
好莱坞原则
好莱坞原则:别调用我们,我们会调用你(经纪人)
意义:高层无需知道调用底层的细节,解耦