模板方法模式——每日的生活行为

一模式定义

模板方法模式:定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中。模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。

二模式举例

1模式分析

我们借用每日生活行为来说明这一模式。



2模板方法模式静态类图



3代码示例

3.1建立算法骨架一AbstractPeople

package com.demo.template;

/**
 * 抽象工人
 * 
 * @author
 * 
 */
public abstract class AbstractPeople {

	/**
	 * 起床方法
	 */
	public void getUp() {
		System.out.println("起床...");
	}

	/**
	 * 抽象吃早餐方法
	 */
	protected abstract void haveBreakfast();

	/**
	 * 抽象乘坐交通工具方法
	 */
	protected abstract void transport();

	/**
	 * 工作方法
	 */
	public void doWork() {
		System.out.println("工作...");
	}

	/**
	 * 模板方法(每天的行为)
	 */
	public final void dayLift() {
		System.out.println("====================");
		// 起床
		getUp();
		// 早餐
		haveBreakfast();
		// 交通工具
		transport();
		// 工作
		doWork();
		System.out.println("====================");
	}
}

3.2具体工人A一PeopleA

package com.demo.template;

/**
 * 工人A
 * 
 * @author
 * 
 */
public class PeopleA extends AbstractPeople {
	/**
	 * 具体吃早餐方法
	 */
	@Override
	protected void haveBreakfast() {
		System.out.println("A早餐吃三明治,喝牛奶...");
	}

	/**
	 * 具体乘坐交通工具方法
	 */
	@Override
	protected void transport() {
		System.out.println("A开私家车上班...");

	}

}

3.3具体工人B一PeopleB

package com.demo.template;

/**
 * 工人B
 * 
 * @author
 * 
 */
public class PeopleB extends AbstractPeople {
	/**
	 * 具体吃早餐方法
	 */
	@Override
	protected void haveBreakfast() {
		System.out.println("B早餐喝粥,吃小菜...");

	}

	/**
	 * 具体乘坐交通工具方法
	 */
	@Override
	protected void transport() {
		System.out.println("B坐公共汽车上班...");

	}

}

3.4具体工人C一PeopleC

package com.demo.template;

/**
 * 工人C
 * 
 * @author
 * 
 */
public class PeopleC extends AbstractPeople {
	/**
	 * 具体吃早餐方法
	 */
	@Override
	protected void haveBreakfast() {
		System.out.println("C早餐吃煎饼,喝豆浆...");
	}

	/**
	 * 具体乘坐交通工具方法
	 */
	@Override
	protected void transport() {
		System.out.println("C坐地铁上班...");

	}

}

3.5客户端测试一Client

package com.demo;

import com.demo.template.AbstractPeople;
import com.demo.template.PeopleA;
import com.demo.template.PeopleB;
import com.demo.template.PeopleC;

/**
 * 主应用程序
 * 
 * @author
 * 
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建A、B、C三个工人
		AbstractPeople peopleA = new PeopleA();
		AbstractPeople peopleB = new PeopleB();
		AbstractPeople peopleC = new PeopleC();

		// 展示三个工人每天的行为
		peopleA.dayLift();
		peopleB.dayLift();
		peopleC.dayLift();
	}
}

4运行结果

====================

起床...

A早餐吃三明治,喝牛奶...

A开私家车上班...

工作...

====================

====================

起床...

B早餐喝粥,吃小菜...

B坐公共汽车上班...

工作...

====================

====================

起床...

C早餐吃煎饼,喝豆浆...

C坐地铁上班...

工作...

====================

三该模式设计原则

1"开-闭"原则

2好莱坞原则

四使用场合

1一次性实现一个算法的不变部分,井将可变的行为留给子类实现。

2各子类中具有公共行为的时候,应被提取出来并集中到一个公共父类以避免代码重复。

3当需要控制子类扩展的时候。模板方法在特定点调用钩子操作,这样只允许在某些点进行扩展。

五模板方法静态类图


 

猜你喜欢

转载自cakin24.iteye.com/blog/2332250