设计模式-templete method

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

模板方法的实现需要语言层面的支持:比如继承,多态。


[b]关注点:[/b]
1、抽象类实现一个算法的不变的部分,并将可变的行为留给子类来实现;抽象类一般用来控制执行流程,是主逻辑;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

2、具体类:具体类的定位是实现算法中的部分个性化的逻辑,即逻辑分解的子逻辑。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。


[b]模式中的角色:[/b]

抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,完成完整的算法。

[b]注意点:[/b]
一般把模板方法定义成final避免被子类修改

JDK中的体现:
ThreadPoolExecutor.Worker
[img]http://hi.csdn.net/attachment/201101/3/0_129405958555W9.gif[/img]

[b]举例:[/b]
角色:抽象模板

package com.pichen.dp.behavioralpattern.templatemethod;

public abstract class Day {

public void getUp(){
System.out.println("get up~");
}
public abstract void breakfast();
public abstract void goToWork();
public abstract void working();
public abstract void lunch();
public abstract void goHome();
public abstract void supper();
public void sleep(){
System.out.println("sleep~");
}
//模板方法
public final void process(){
getUp();
breakfast();
goToWork();
working();
lunch();
working();
goHome();
supper();
sleep();
}
}

具体子类:

public class ProgrammerDay extends Day{

/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#breakfast()
*/
@Override
public void breakfast() {
System.out.println("breakfast:noodle~");

}

/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#goToWork()
*/
@Override
public void goToWork() {
System.out.println("goToWork:drive car~");

}

/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#working()
*/
@Override
public void working() {
System.out.println("working: coding~");

}

/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#lunch()
*/
@Override
public void lunch() {
System.out.println("lunch: eat rice~");

}

/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#goHome()
*/
@Override
public void goHome() {
System.out.println("goHome: walk~");
}

/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#supper()
*/
@Override
public void supper() {
System.out.println("supper: rice~");
}

}


客户端:

public class Main {

public static void main(String[] args) {
Day programmerDay = new ProgrammerDay();
programmerDay.process();
}
}


输出:
get up~
breakfast:noodle~
goToWork:drive car~
working: coding~
lunch: eat rice~
working: coding~
goHome: walk~
supper: rice~
sleep~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值