\(^_^)/ 设计模式_模板方法

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

 

使用了继承,并肯定了这个继承的意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。

 

所谓模板模式,就是在父类中定义算法的主要流程,而把一些个性化的可变部分步骤延迟到子类中去实现,父类始终控制着整个流程的主动权,子类只是辅助父类实现某些可定制的步骤。

模版方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。 

 

 

HttpServlet中的doGet,doPost,doPut,doDelete等方法

spring中被大量使用,如:jdbcTemplate,hibernateTemplate,JndiTemplate以及一些包围的包装等都无疑使用了模板模式,但spring并不是单纯使用了模板方法,而是在此基础上做了创新,配合callback(回调)一起使用,用得极其灵活。 

 

 

1.抽象模板:定义了一个或者多个抽象操作,以便让子类实现,为基本操作。

2.具体模板:实现了父类定义的一个或者多个抽象方法,每个抽象模板角色都有其具体模板角色与之对应。换言之,模板方法在抽象类里面定义了一个骨架流程,A,B,C,然后在具体模板方法(子类)里面实现A,B,C

 

 

模板方法中的方法可以分为:模板方法(TempleteMethod)和基本方法(primitive Method)。

1.模板方法:是指定义在抽象类的一个具体的方法,把基本操作方法组合在一起形成一个总算法或一个总行为,通常定义为final,它定义了整个算法的逻辑骨架。

2.基本方法:包括抽象方法,具体方法,钩子方法(do开头命名)。

a.抽象方法: 抽象模板中定义为抽象方法,由子类实现。

b.具体方法: 抽象模板中提供默认实现。

    c.钩子方法:抽象模板中定义并提供默认实现(通常是空实现),在子类中覆盖或扩展。

 

 

模板方法模式中,抽象类的模板方法应该声明为final的,从而保证了子类的逻辑永远由父类所控制。

 

 

1.抽象模板角色:抽象类

2.具体模板角色:具体实现类

 

 

 

要点:

1. 模板方法中的非final方法(默认实现或不做事的方法)称为“钩子”。

2. 钩子可以简化子类的实现。

3. 钩子可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应。

4. primitiveMethod的命名最好加上do前缀。

5. 工厂模式为模板方法模式的特例。

6. 除了可以灵活应对子步骤的变化外,“不用调用我,让我来调用你”的反向控制结构是Template Method的典型应用。

7. 模板方法是代码复用的一项基本的技术,在类库中尤其重要。,它遵循“抽象类应当拥有尽可能多的行为,应当拥有尽可能少的数据”的重构原则。

 

 

 

 

适用性:

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

2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

3. 控制子类扩展。模板方法只在特定点调用Hook操作,这样就只允许在这些点进行扩展。

 

 

实例:

1.抽象模板类

public abstract class AbstractTemplateMethod {

	public final void process() {
		this.step1();
		this.step2();
		this.step3();
		this.step4();
		this.step5();
	}

	public abstract void step1();

	public abstract void step2();

	public abstract void step3();

	public final void step4() {
		System.out.println("step4 ...");
	}

	private void step5() {
		System.out.println("step5 ...");
	}
}

 

 

2.具体实现类

public class ConcretenessMethod extends AbstractTemplateMethod {

	@Override
	public void step1() {
		System.out.println("step1 ...");
	}

	@Override
	public void step2() {
		System.out.println("step2 ...");
	}

	@Override
	public void step3() {
		System.out.println("step3 ...");
	}

}

 

 

3.调用测试

public class Test {
	public static void main(String[] args) {
		AbstractTemplateMethod atm = new ConcretenessMethod();
		atm.process();
	}
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值