设计模式入门之模板方法模式TemplateMethod

模板方法模式定义:

定义一个算法的骨架,而将步骤延迟到子类中。这种模式可以使得在不改变算法骨架(模板)的情况下修改每个步骤的具体实现

从功能上来看,这个模式跟生成器模式有些相像,只不过生成器模式定义了创建对象的过程,而模板方法模式定义了算法过程

感觉这个模式要简单很多。

钩子:可以被子类覆盖以实现扩展的方法通常叫做钩子

实例:用户登录过程,分为后台人员登录和用户登录,这是一个非常成型的技术过程,是非常典型的模板方法模式的应用,其中普通用户密码不需要加密,而工作人员的密码需要进行加密比对。上代码

//登录Model
//封装进行登录控制所需要的数据
public class LoginModel {
	private String loginId;
	private String pwd;
	//get set methods
}
//定义登录控制的算法骨架
//因为登录中的过程是一致的,所以把过程抽象出来,用抽象类来定义子类公共方法
public abstract class LoginTemplate {
	public final boolean login(LoginModel lm) {
		LoginModel dbLm = this.findLoginUser(lm.getLoginId());
		if(dbLm != null) {
			String encryptPwd = this.encryptPwd(lm.getPwd());
			lm.setPwd(encryptPwd);
			return this.match(lm, dbLm);
		}
		return false;
	}

	public abstract LoginModel findLoginUser(String loginId);

	public String encryptPwd(String pwd) { //钩子
		return pwd;
	}

	public boolean match(LoginModel lm,LoginModel dbLm) {
		if(lm.getLoginId().equals(dbLm.getLoginId()) && lm.getPwd().equals(dbLm.getPwd())) {
			return true;
		}
		return false;
	}
}
//普通用户登录控制的逻辑处理
public class NormalLogin extends LoginTemplate {
	public LoginModel findLoginUser(String loginId) {
		LoginModel lm = new LoginModel();
		lm.setLoginId(loginId);
		lm.setPwd("password");
		return lm;
	}
}
//工作人员登录控制的逻辑处理
public class WorkerLogin extends LoginTemplate {
	public LoginModel findLoginUser(String loginId) {
		LoginModel lm = new LoginModel();
		lm.setLoginId(loginId);
		lm.setPwd("password");
		return lm;
	}

	public String encryptPwd(String pwd) {
		System.out.println("进行Md5加密");
		return pwd;
	}
}
//客户端调用
public class Client {
	public static void main(String[] args) {
		LoginModel lm = new LoginModel();
		lm.setLoginId("admin");
		lm.setPwd("workerpwd");

		LoginModel lm2 = new LoginModel();
		lm2.setLoginId("normaluser");
		lm2.setPwd("normalpwd");

		LoginTemplate lt = new WorkerLogin();
		LoginTemplate lt2 = new NormalLogin();

		boolean flag = lt.login(lm);
		System.out.println("可以登录工作平台="+flag);

		boolean flag2 = lt2.login(lm2);
		System.out.println("可以进行普通登录="+flag2);
	}
}

这里复习几个小的知识点:

1.接口和抽象类

(1)接口是特殊的抽象类,接口中所有方法必须是抽象的,不能有具体实现;而抽象类中可以有实现的方法

(2)抽象类不一定包含抽象方法,有抽象方法的类一定是抽象类

(3)需要约束子类行为时用接口,既要约束子类行为,又要为其提供公共功能时用抽象类

模板方法模式中提现了好莱坞法则:不要来找我们,我们会找你。因为在该例中,子类只定义了会被父类调用的方法,调用是从父类方法发起的

设计模式入门之模板方法模式TemplateMethod

时间: 2024-10-04 21:40:00

设计模式入门之模板方法模式TemplateMethod的相关文章

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg

设计模式--15、模板方法模式

设计模式学习笔记-模板方法模式 1. 概述 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 2. 模式中的角色 2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法. 3. 模式解读 3.1 模板方法类图 3.2 模板方法模式代码实现 /// <summary> /// 抽象类 /// </summa

C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

原文:C#设计模式之十三模板方法模式(Template Method Pattern)[行为型] 一.引言 "结构型"的设计模式已经写完了,从今天我们开始讲"行为型"设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Pattern.还是老套路,先从名字上来看看."模板方法"我第一次看到这个名称,我的理解是,有一个方法的名字叫"模板方法",后来深入学习之后,

设计模式入门之访问者模式Visitor

Set集合的配置 数据表的创建:表关系一个员工拥有多个身份 create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); create table CERTIFICATE ( id INT NOT NULL aut

设计模式C++实现——模板方法模式

模式定义: 模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板就是一个方法.更具体的说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类实现.这可以确保算法的结果保持不变,同时由子类提供部分实现. 模式结构: 举例: 泡咖啡和泡茶步骤与基本相同,定义咖啡和茶的类如下: class Coffee { public: void prepareRecipe() { boilWater(

设计模式入门之备忘录模式Memento

//备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就可以将该对象恢复到原先保存的状态 //实例:测试两种方案,两种方案在第一阶段的过程是相同的,第二阶段是不同的 //实例代码 //备忘录对象的窄接口 public interface FlowAMockMemento { //空的,所谓窄接口,即只是一个标识作用,它的持有者不可以调用任何它的方法 } //测试流程类 public class FlowAMock { private

设计模式入门之桥接模式Bridge

//桥接模式定义:将抽象部分与它的实现部分分离,使得他们都可以独立地变化 //广义来讲,桥接模式非常普遍,面向抽象编程,面向接口编程就可以看作是他的体现 //实例:一个系统,要按照不同的要求发信息(普通,加急,特急),而且还要以不同的方式发送(站内信,Email,短信)等,考虑到其扩展性,用桥接模式再合适不过了 //上代码 //桥接的一半---抽象部分 public abstract class AbstractionMessage { protected MessageImplementor

设计模式入门之迭代器模式Iterator

迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部实现 迭代器模式的结构和说明 Iterator::迭代器接口.定义访问和遍历元素的接口 ConcreteIterator:具体的迭代器实现对象.实现对聚合对象的遍历,并跟踪遍历时的当前位置 Aggregate:聚合对象.定义创建相应迭代器对象的接口 ConcreteAggregate:具体聚合对象.实现创建相应的迭代器对象 实例:一个公司,工资列表是用List实现的,后收购一家公司,工资列表是用Array实现

c#设计模式系列:模板方法模式(Template Method Pattern)

引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来