模板方法模式

模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模版方法使得子类可以在不改变算法

结构的情况下,重新定义算法中某些步骤的具体实现。一般模板方法模式都会在方法上加final。

public abstract class DriverTemplate {

public final void drive(){
	
	openDoor();
	startEngine();
	gear();
	go();
	brake();
	stop();
}

protected  abstract  void openDoor();
protected void startEngine(){
	System.out.println("engine started!");
}

protected abstract void gear();
protected void go(){
	System.out.println("running...");
}

protected abstract void brake();
protected void stop(){
	System.out.println("stopped!");
}

}

public class SuzukiScross extends DriverTemplate{

@Override
protected void brake() {
	// TODO Auto-generated method stub
	System.out.println("brake with foot");
}

@Override
protected void gear() {
	// TODO Auto-generated method stub
	System.out.println("gear with hand");
}

@Override
protected void openDoor() {
	// TODO Auto-generated method stub
	System.out.println("keyless entry");
}

}

public class SuzukiStrom1000 extends DriverTemplate{

@Override
protected void brake() {
	// TODO Auto-generated method stub
	System.out.println("brake with hand");
}

@Override
protected void gear() {
	// TODO Auto-generated method stub
	System.out.println("gear with foot");
}

@Override
protected void openDoor() {
	// TODO Auto-generated method stub
	System.out.println("no door actually");
}

}

public class MyTest {

/**
 * @param args
 */
public static void main(String[] args) {
	// TODO Auto-generated method stub
	
	DriverTemplate template = new SuzukiStrom1000();

// DriverTemplate template = new SuzukiScross();
template.drive();

}

}

模版方法模式使用注意几点
1.保护抽象类中定义算法顺序的方法不被子类修改。
2.分离可变及不可变部分,让子类自己决定可变部分的实现。
3.让算法的具体实现对子类开放,对其他类关闭。

public abstract class AbstractCake {

protected abstract void shape();
protected abstract void apply();
protected abstract void brake();

}

class CreamCake extends AbstractCake{

@Override
protected void apply() {
	// TODO Auto-generated method stub
	System.out.println("奶油蛋糕涂抹");
}

@Override
protected void brake() {
	// TODO Auto-generated method stub
	System.out.println("奶油蛋糕烘培");
}

@Override
protected void shape() {
	// TODO Auto-generated method stub
	System.out.println("奶油蛋糕造型");
}

}

class CheeseCake extends AbstractCake{

@Override
protected void apply() {
	// TODO Auto-generated method stub
	System.out.println("芝士蛋糕涂抹");
}

@Override
protected void brake() {
	// TODO Auto-generated method stub
	System.out.println("芝士蛋糕烘培");
}

@Override
protected void shape() {
	// TODO Auto-generated method stub
	System.out.println("芝士蛋糕造型");
}


class MouseCake extends AbstractCake{

	@Override
	protected void apply() {
		// TODO Auto-generated method stub
		System.out.println("慕斯蛋糕涂抹");
	}

	@Override
	protected void brake() {
		// TODO Auto-generated method stub
		System.out.println("慕斯蛋糕烘培");
	}

	@Override
	protected void shape() {
		// TODO Auto-generated method stub
		System.out.println("慕斯蛋糕造型");
	}
	
}

}

abstract class AbstractCake{
protected boolean shouldApply(){
return true;
}
protected abstract void shape();
protected abstract void apply();
protected abstract void brake();
public final void run(){
this.shape();
if(this.shouldApply()){
this.apply();
}
this.brake();
}
}

class SmallCake extends AbstractCake {

private boolean flag = false;
public void setFlag(boolean shouldApply){
    flag = shouldApply;
}
@Override
protected boolean shouldApply() {
    return this.flag;
}
@Override
protected void shape() {
    System.out.println("小蛋糕造型");
}

@Override
protected void apply() {
    System.out.println("小蛋糕涂抹");
}

@Override
protected void brake() {
    System.out.println("小蛋糕烘焙");
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值