23种java设计模式之模板模式
2016-08-01 15:13
253 查看
说实话,我们学的框架其实就是模板,是不是这样引出话题就能很快理解模板模式呢,好了,下面我们用一个经典的泡咖啡,泡茶案例来说明模板模式。
泡咖啡步骤:水烧开--->冲泡咖啡粉--->把咖啡倒入杯子--->加糖和牛奶
泡茶步骤:水烧开--->冲泡茶叶--->把茶水导入杯子--->加柠檬
对于传统方法来思考,给一个HotDrinkHook超类,然后给出每个步骤的抽象类,让子类Coffee和Tea去完成,但是,有没有考虑到这泡咖啡和泡茶两者是否有共同点呢?比如第一个步骤和第三个步骤,完全一样嘛,所以,我们可以用模板模式来解决这个问题。
我们先给出分析类图:
给出超类HotDrinkHook:
public abstract class HotDrinkHook {
public final void Prepare(){
//烧水
BoilWater();
//泡(茶、咖啡)
Brew();
//倒进杯子
PutInCup();
//加配料
if(wantAddCondiments()){
AddCondiments();
}else{
System.out.println("不用了,谢谢!!!");
}
}
public boolean wantAddCondiments() {
//默认为需要添加
return true;
}
public abstract void AddCondiments();
private void PutInCup() {
System.out.println("把做好的倒入杯子!!!");
}
public abstract void Brew();
private final void BoilWater() {
System.out.println("把水烧开!!!");
}
}
对于那两个相同的方法我们用final来修饰,保证后面的子类也是按照这个方法,然后对于不同的方法我们用抽象方法写出,让子类自己去实现,这里我们还给出了第四步,让顾客自己选择是否加配料
CoffeeHook 子类:
public class CoffeeHook extends HotDrinkHook {
public void AddCondiments() {
System.out.println("加入咖啡!!!");
}
public void Brew() {
System.out.println("泡咖啡!!!");
}
public boolean wantAddCondiments() {
System.out.println("您是否要添加调味品(y/n):");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str="";
try {
str=br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(str.equals("n")){
return false;
}
return true;
}
}
对于TeaHook就是两个方法不同,别的和CoffeeHook一样:
public void AddCondiments() {
System.out.println("加入柠檬!!!");
}
public void Brew() {
System.out.println("泡茶!!!");
}
最后测试Test:
public class Test {
public static void main(String[] args){
TeaHook teaHook=new TeaHook();
CoffeeHook coffeeHook=new CoffeeHook();
teaHook.Prepare();
coffeeHook.Prepare();
}
}
这样就可以满足条件了。
总结:
模板模式:模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现
通俗讲模板模式是这个算法或者说这个步骤是final的,不变的,保证了后面的子类也是按照这个算法做的,然后子类里面只要关系抽象函数的实现,不用关系步骤什么的,所以子类里面关心的东西就少多了,同时它把东西放在超类后,整个体系要改的话,只要在超类里改就行了,所以一定程度上对于维护,拓展,集中管理,更好维护。
泡咖啡步骤:水烧开--->冲泡咖啡粉--->把咖啡倒入杯子--->加糖和牛奶
泡茶步骤:水烧开--->冲泡茶叶--->把茶水导入杯子--->加柠檬
对于传统方法来思考,给一个HotDrinkHook超类,然后给出每个步骤的抽象类,让子类Coffee和Tea去完成,但是,有没有考虑到这泡咖啡和泡茶两者是否有共同点呢?比如第一个步骤和第三个步骤,完全一样嘛,所以,我们可以用模板模式来解决这个问题。
我们先给出分析类图:
给出超类HotDrinkHook:
public abstract class HotDrinkHook {
public final void Prepare(){
//烧水
BoilWater();
//泡(茶、咖啡)
Brew();
//倒进杯子
PutInCup();
//加配料
if(wantAddCondiments()){
AddCondiments();
}else{
System.out.println("不用了,谢谢!!!");
}
}
public boolean wantAddCondiments() {
//默认为需要添加
return true;
}
public abstract void AddCondiments();
private void PutInCup() {
System.out.println("把做好的倒入杯子!!!");
}
public abstract void Brew();
private final void BoilWater() {
System.out.println("把水烧开!!!");
}
}
对于那两个相同的方法我们用final来修饰,保证后面的子类也是按照这个方法,然后对于不同的方法我们用抽象方法写出,让子类自己去实现,这里我们还给出了第四步,让顾客自己选择是否加配料
CoffeeHook 子类:
public class CoffeeHook extends HotDrinkHook {
public void AddCondiments() {
System.out.println("加入咖啡!!!");
}
public void Brew() {
System.out.println("泡咖啡!!!");
}
public boolean wantAddCondiments() {
System.out.println("您是否要添加调味品(y/n):");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str="";
try {
str=br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(str.equals("n")){
return false;
}
return true;
}
}
对于TeaHook就是两个方法不同,别的和CoffeeHook一样:
public void AddCondiments() {
System.out.println("加入柠檬!!!");
}
public void Brew() {
System.out.println("泡茶!!!");
}
最后测试Test:
public class Test {
public static void main(String[] args){
TeaHook teaHook=new TeaHook();
CoffeeHook coffeeHook=new CoffeeHook();
teaHook.Prepare();
coffeeHook.Prepare();
}
}
这样就可以满足条件了。
总结:
模板模式:模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现
通俗讲模板模式是这个算法或者说这个步骤是final的,不变的,保证了后面的子类也是按照这个算法做的,然后子类里面只要关系抽象函数的实现,不用关系步骤什么的,所以子类里面关心的东西就少多了,同时它把东西放在超类后,整个体系要改的话,只要在超类里改就行了,所以一定程度上对于维护,拓展,集中管理,更好维护。
相关文章推荐
- Java23种设计模式——模板模式
- 走穿java23种设计模式--13模板方法模式详解
- Java 23种设计模式之模板方法模式
- java23种设计模式之一--模板模式
- Java开发中的23种设计模式之十四:模板方法模式(Template Method)
- 23种java设计模式之模板设计模式
- Java开发中的23种设计模式详解----模板方法模式(Template Method)
- Java23种设计模式之-----模板方法模式
- JAVA开发的23种设计模式之 --- 模板模式
- java23种常用设计模式之模板方法模式(Template Method)
- java_23种设计模式之模板方法模式
- 【行为型模式】模板方法模式(template method)之23种java设计模式
- java关于23种设计模式的有趣见解
- 追MM与JAVA的23种设计模式
- 追MM与Java的23种设计模式
- java关于23种设计模式的有趣见解
- 追MM与Java的23种设计模式
- JAVA23种设计模式的代码
- 追MM与JAVA23种设计模式
- 追MM与Java的23种设计模式