设计模式学习之路 - 模板方法模式 - 专注于流程

今天我们了解一下模板方法模式。

这个模式,我觉得大家听的不多,但是用的特别多,稍微有点年限的程序猿应该都在经常使用这个模式(但是可能不知道, 或者是这个模式的变相)


模板,就是一个通用的东西, 平时大家在编程的时候,只要遇到相同的代码,都会提取方法出来,然后共用方法,减少代码量,

这是最基本的重构,稍微有点强迫症的人会经常这样做, 而模板方法,只是比这个稍微高级一丢丢,关注点也不一样。


平时大家做事的时候会喝点东西,比如,咖啡,茶什么的。

然后我们现在需要泡一杯咖啡或者泡一杯茶给自己润润嗓子。

大家都知道泡咖啡的步骤:1.烧开水   2.用开水冲咖啡   3.把咖啡倒进杯子  4.加点糖或者奶

package com.chris.template;

public class Coffee {
	void prepareRecipe(){
		boilWater();
		brewCoffeeGrinds();
		pourInCup();
		addSugarAndMilk();
	}
	
	public void boilWater(){
		System.out.println("Boiling water");
	}
	
	public void brewCoffeeGrinds(){
		System.out.println("Dripping Coffee through filter");
	}
	
	public void pourInCup(){
		System.out.println("Pouring into cup");
	}
	
	public void addSugarAndMilk(){
		System.out.println("Adding Sugar and Milk");
	}
}

同样,茶大家泡的也不会少: 1.烧开水   2.用开水浸泡茶叶  3.把茶倒进杯子  4.加点柠檬或者什么

package com.chris.template;

public class Tea {
	void prepareRecipe(){
		boilWater();
		steepTeaBag();
		pourInCup();
		addLemon();
	}
	
	public void boilWater(){
		System.out.println("Boiling water");
	}
	
	public void steepTeaBag(){
		System.out.println("Steeping the tea");
	}
	
	public void pourInCup(){
		System.out.println("Pouring into cup");
	}
	
	public void addLemon(){
		System.out.println("Adding Lemon");
	}
}


然后,我们可以发现,其实泡咖啡和泡茶,虽然不是一个事情,但是他的操作方法十分的相似,是不是可以提取出来些什么。。

烧开水和倒进杯子是一样的,其他的两个操作,一个是泡东西, 一个是加调料,这样看来, 其实,两个的操作是一样的。。


然后我们提取出一个超类,咖啡因饮料(其实茶中有咖啡因。。)

package com.chris.template;

public abstract class CaffeineBeverage {
	final void prepareRecipe(){
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
	
	public void boilWater(){
		System.out.println("Boiling water");
	}
	public void pourInCup(){
		System.out.println("Pouring into cup");
	}
	
	public abstract void brew();
	public abstract void addCondiments();
}

这个超类中,有两个抽象方法,我们不在超类中作实现,把他的实现延迟到子类中去。

这样的话, 上面两个饮料就可以去继承这个超类了,并且实现它的抽象方法。

新的Coffee类。。

package com.chris.template.template;

import com.chris.template.CaffeineBeverage;

public class Coffee extends CaffeineBeverage{
	
	@Override
	public void brew() {
		System.out.println("Dripping Coffee through filter");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding Sugar and Milk");
	}
}

新的Tea类。。

package com.chris.template.template;

import com.chris.template.CaffeineBeverage;

public class Tea extends CaffeineBeverage{
	
	@Override
	public void brew() {
		System.out.println("Steeping the tea");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding Lemon");
	}
}

到这里, 模板方法模式就完成了!!!

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


在demo中, 超类定义了总的泡东西的一个框架,把步骤列出来了,这样的话,他的模板方法就定住了, 而把具体的操作留给子类去实现。

这样的好处就是子类不会影响到整个的流程, 只需要负责自己这一块的实现就行了。


在平时的开发中,有很多地方会使用到模板方法模式, 这个方法比较简单,这里就不一一列举了。


有什么错误的地方还望纠正, 和大家共勉!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值