设计模式——模板模式

 

比较详细的资料:

https://www.cnblogs.com/jenkinschan/p/5768760.html 

https://blog.csdn.net/kongzhongniao/article/details/80497565

 

一、定义:定义一个操作中的算法的框架,而将这些步骤的实现延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。  其中它的方法分为两类:1、基本方法。2、模板方法(模板方法是对基本方法的调用,有一定的逻辑,一般加上final关键词)。

二、通用UML图:

 

 

三、通用代码:

package 模板模式通用;
//抽象类
public abstract class AbstractClass {
	public abstract void doSomthing();
	public abstract void doAnything();
	public void templateMethod() {   //模板模式的这个方法都这样么???
		this.doSomthing();
		this.doAnything();
	}
}
//具体子类1
public class ConcreteClass1 extends AbstractClass {

	@Override
	public void doSomthing() {
		System.out.println("1号子类做了一些事");

	}
	@Override
	public void doAnything() {
		System.out.println("1号子类做任何一件事");
	}
}
//具体子类2
public class ConcreteClass2 extends AbstractClass {
	@Override
	public void doSomthing() {
		System.out.println("2号子类做了一些事");
	}
	@Override
	public void doAnything() {
		System.out.println("2号子类做任何一件事");
	}
}

//情景类
public class Client {
	public static void main(String args[]) {
		AbstractClass a1=new ConcreteClass1();
		AbstractClass a2=new ConcreteClass2();
		
		a1.templateMethod();
		System.out.println();
		a2.templateMethod();
	}
}

 

示例:

        几乎所有的应用系统,都需要系统登录控制的功能,有些系统甚至有多个登陆控制的功能。

以一个基于Web的企业级应用系统为例,有管理员和普通员工两种方式。

思考:

     两部分分别实现就不说了,“不好想到”。然后考虑两种登陆方式大同小异,所以可以抽象出相同的地方,即登陆流程可以做成一个模板类。。。

 

 

 

示例2:

咖啡与茶的冲泡。

抽象模板类:

package 冲咖啡;

public abstract class AbstractDrink {
	public void water() {
		System.out.println("把水煮沸");
	}
	public abstract void flush();
	public abstract void put();
	public abstract void addSugar();
	
	public void  start() {
		this.water();
		this.flush();
		this.put();
		this.addSugar();
	}
	

}

冲茶具体实现类:

package 冲咖啡;

public class Tea extends AbstractDrink {

	@Override
	public void flush() {
		System.out.println("用沸水冲泡茶叶");
	}

	@Override
	public void put() {
		System.out.println("把茶倒进杯子");

	}

	@Override
	public void addSugar() {
		System.out.println("加柠檬");

	}

}

冲咖啡具体实现类:

package 冲咖啡;

public class Coffe extends AbstractDrink {

	@Override
	public void flush() {
		System.out.println("用沸水冲泡咖啡");
	}

	@Override
	public void put() {
		System.out.println("把咖啡倒进杯子");

	}

	@Override
	public void addSugar() {
		System.out.println("加糖和牛奶");
	}

}

 

场景类:

public class Client {

	public static void main(String[] args) {
		AbstractDrink ad=new Coffe();
		AbstractDrink ad2=new Tea();
		
		ad.start();
		System.out.println();
		ad2.start();
		

	}

}

 

感想:

       模板类本身概念挺简单,也经常不知不觉的使用,注意的是模板模式体现了好莱坞原则。

PS:注意好莱坞法则、控制倒转(IOC)、反射、依赖注入的关系。。。

 

 

The end;

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值