模板方法模式
2014-11-06 00:21
155 查看
模板方法,顾名思义,意思就是制定一个模板来执行程序,这是我们程序开发中的一个比较常用的一种模式,下面我来给大家展示一个模板方法的例子和模板方法的利弊:
需求分析:就算我们银行系统的业务也是一样,都有一个流程要进行业务。要去银行办理业务的时候一般都会走一个这样的流程,取预约号,等待呼叫,办理业务,业务办理后预约号销毁。这样的话,按照我们之前没有封装的话,我们就会每一个对象都会给他们加这个业务的实现,这样就会重复很多代码,不利于维护,代码量也比较多,同时,不同的人办理的业务是不一样的,也就是前流程他们走的是一样的,但是办理的业务是不一样的。那我们将他们重复的一样的流程抽取出来,封装成一个抽象基类,这个抽象基类的作用就是规定整个算法的框架。下面我们举个例子:比如甲乙两个学生,他们每天都会起床,上学,回家,睡觉。这几个动作,但是他们的上学的方式和回家的方式不一样,甲是搭公交去上学,乙是骑自行车,那这样我们就可以将这四个方法放在抽象基类的算法框架里面。将上学,回家这两个方法做成抽象方法,让具体的子类继承时改写。
首先:
建立一个抽象基类Baselucheng
package com.example.moban;
public abstract class Baselucheng {
/*
* 定义抽象基类的方法,final的作用是规定好整个框架的算法,不能被子类继承改写,在print()方法中调用四个方法
*/
public final void print(){
wakeUp();
goSchool();
//这是勾的形式,就是可以给子类判定需不需要执行该方法
if(isGoHome()){goHome();}
goBed();
}
protected abstract boolean isGoHome() ;
private void goBed() {
System.out.println("主人睡觉了");
}
/*
* 该方法根据不同的子类,进行不同的操作
*/
protected abstract void goHome();
/*
* 同上
*/
protected abstract void goSchool();
private void wakeUp() {
System.out.println("主人起床了");
}
}
定义两个实体Persion01 (甲)
package com.example.moban;
//继承抽象基类
public class Persion01 extends
Baselucheng {
//重写回家的方法
@Override
protected void goHome() {
System.out.println("搭公交回家");
}
//重写去上学的方法
@Override
protected void goSchool() {
System.out.println("搭公交去上学");
}
//钩子,可以判定是否需要执行对应的方法
@Override
protected boolean isGoHome() {
return false;
}
}
Persion02
package com.example.moban;
public class Person01 extends Baselucheng {
@Override
protected void goHome() {
System.out.println("骑自行车去回家");
}
@Override
protected void goSchool() {
System.out.println("骑自行车去学校");
}
@Override
protected boolean isGoHome() {
return true;
}
}
下面我们写个测试类PersonTest
package com.example.moban;
public class PersonTest {
public static void main(String args[])
{
Baselucheng persion01=new Person01();
Baselucheng persion02=new Person02();
System.out.println("这是甲的一天");
persion01.print();
System.out.println("----------------------------------------------");
System.out.println("这是乙的一天");
persion02.print();
}
}
---------------------------------------------------执行结果---------------------------------------------------------------------
这是甲的一天
主人起床了
搭公交去上学
搭公交回家
主人睡觉了
----------------------------------------------
这是乙的一天
主人起床了
骑自行车去学校
骑自行车去回家
主人睡觉了
-------------------------------------------------------------------------------------------------------------------------------------------
会根据子类的不同改写方法调用。这就是模板方法模式
相信模板方法的好处大家已经可以看到了吧。非常容易封装,也容易拓展,只需要在子类中实现相对应的方法,其余相同的方法交给抽象基类去实现。
弊端就是:我们以后出去工作很多都是以前遗留的系统,里面很多代码重复,但是由于很多实现类已经继承了相对应的类,而JAVA又只是支持单继承机制,所以面对以前遗留的系统很难将模板方法套用上去。
需求分析:就算我们银行系统的业务也是一样,都有一个流程要进行业务。要去银行办理业务的时候一般都会走一个这样的流程,取预约号,等待呼叫,办理业务,业务办理后预约号销毁。这样的话,按照我们之前没有封装的话,我们就会每一个对象都会给他们加这个业务的实现,这样就会重复很多代码,不利于维护,代码量也比较多,同时,不同的人办理的业务是不一样的,也就是前流程他们走的是一样的,但是办理的业务是不一样的。那我们将他们重复的一样的流程抽取出来,封装成一个抽象基类,这个抽象基类的作用就是规定整个算法的框架。下面我们举个例子:比如甲乙两个学生,他们每天都会起床,上学,回家,睡觉。这几个动作,但是他们的上学的方式和回家的方式不一样,甲是搭公交去上学,乙是骑自行车,那这样我们就可以将这四个方法放在抽象基类的算法框架里面。将上学,回家这两个方法做成抽象方法,让具体的子类继承时改写。
首先:
建立一个抽象基类Baselucheng
package com.example.moban;
public abstract class Baselucheng {
/*
* 定义抽象基类的方法,final的作用是规定好整个框架的算法,不能被子类继承改写,在print()方法中调用四个方法
*/
public final void print(){
wakeUp();
goSchool();
//这是勾的形式,就是可以给子类判定需不需要执行该方法
if(isGoHome()){goHome();}
goBed();
}
protected abstract boolean isGoHome() ;
private void goBed() {
System.out.println("主人睡觉了");
}
/*
* 该方法根据不同的子类,进行不同的操作
*/
protected abstract void goHome();
/*
* 同上
*/
protected abstract void goSchool();
private void wakeUp() {
System.out.println("主人起床了");
}
}
定义两个实体Persion01 (甲)
package com.example.moban;
//继承抽象基类
public class Persion01 extends
Baselucheng {
//重写回家的方法
@Override
protected void goHome() {
System.out.println("搭公交回家");
}
//重写去上学的方法
@Override
protected void goSchool() {
System.out.println("搭公交去上学");
}
//钩子,可以判定是否需要执行对应的方法
@Override
protected boolean isGoHome() {
return false;
}
}
Persion02
package com.example.moban;
public class Person01 extends Baselucheng {
@Override
protected void goHome() {
System.out.println("骑自行车去回家");
}
@Override
protected void goSchool() {
System.out.println("骑自行车去学校");
}
@Override
protected boolean isGoHome() {
return true;
}
}
下面我们写个测试类PersonTest
package com.example.moban;
public class PersonTest {
public static void main(String args[])
{
Baselucheng persion01=new Person01();
Baselucheng persion02=new Person02();
System.out.println("这是甲的一天");
persion01.print();
System.out.println("----------------------------------------------");
System.out.println("这是乙的一天");
persion02.print();
}
}
---------------------------------------------------执行结果---------------------------------------------------------------------
这是甲的一天
主人起床了
搭公交去上学
搭公交回家
主人睡觉了
----------------------------------------------
这是乙的一天
主人起床了
骑自行车去学校
骑自行车去回家
主人睡觉了
-------------------------------------------------------------------------------------------------------------------------------------------
会根据子类的不同改写方法调用。这就是模板方法模式
相信模板方法的好处大家已经可以看到了吧。非常容易封装,也容易拓展,只需要在子类中实现相对应的方法,其余相同的方法交给抽象基类去实现。
弊端就是:我们以后出去工作很多都是以前遗留的系统,里面很多代码重复,但是由于很多实现类已经继承了相对应的类,而JAVA又只是支持单继承机制,所以面对以前遗留的系统很难将模板方法套用上去。
相关文章推荐
- 连接两个模板方法模式?
- 模板方法(Template Method)模式
- 深入浅出模板方法模式
- 模板方法模式(Template Method Pattern)
- C++主题——Template Method(模板方法)模式
- 深入浅出Java模式设计之模板方法模式
- 设计模式学习日志(14)-TemplateMethod模板方法(行为型模式)
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
- 模板方法模式实现探讨
- 设计模式学习笔记(二十四)——Template Method模板方法
- TemplateMethod模板方法(行为型模式)
- 设计模式(12)-模板方法模式(Template Method)
- 模板方法模式(Template Mothod Pattern)
- 求同存异——Java模式系列谈之模板方法
- 模板方法模式(Template Method Pattern)学习笔记
- 设计模式(14)-模板方法模式(Template Method)
- 设计模式之模板方法模式(Template Method)
- 《设计模式精解》学习笔记(十四)------Template Method(模板方法)模式
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
- 模板方法(Template Method)-----类行为型模式