(TemplateMethod)模板方法设计模式
所谓设计模式就是指:所谓模板方法模式是指:“定义一个操作中 的算法的骨架,而将一些步骤延迟到子类中。
Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改 变算法架构的情况下,重新定义算法中的某些步骤
定义一个操作中的算法的骨架,而将步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义某些特定的步骤。
我们需要准备一个"抽象类",将部分逻辑以具体的方法以及构造函数的形式实现, 然后声明一些抽象方法来让"子类"实现剩余的逻辑。
不同的"子类" 可以以不同的方式来实现这些抽象法,从而对剩余的逻辑有不同的实现。
结构
●
抽象模板角色( Abstract Template):定义了一个或多个抽象操作以便让子类实现,定义并实现了一个模板方法。
●
具体模板角色( Concrete Template): 实现父类所定义的一个或多个抽象方法。每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现。
优点缺点
优点:
1.模板方法模式通过把不变的行为定义父类中, 去除了子类的重复代码(提高代码的复用性)
-
子类实现算法的某些细节,有助于算法的扩展
3.通过一个父类调用子类实现的操作,通过子类扩展新的行为(方法)
缺点: 每个不同的实现都需要定义一个子类,随着子类的个数的增加,设计比较混乱
什么时候需要使用到模板方法模式?
现实生活中有很多事情的完成过程都包含几个基本的步骤。
模板方法模式是基于"继承"的"代码复用"的基本技术
在模板方法模式中,可以将"相同的代码"放在父类中,而将"不同的方法的实现"放在不同的子类中。
例如:我们刚刚的示例,
在父类中定义一系列的步骤
由于 登录方式不同,选择的英雄技能不同,所以 具体的登录方式由子类实现
① 在模板方法模式中,我们需要准备一个"抽象类", 将部分逻辑以"具体方法"实现,
声明一些"抽象方法"让子类实现,不同的子类可以以不同的方式实现这些抽象方法。
模拟王者荣耀界面QQ或者微信登录
public abstract class Model {
//使用qq,微信时,密码登录
public abstract boolean login(String uname,String upwd);
}
public class QQ extends Model{
@Override
public boolean login(String uname, String upwd) {
if("100000".equals(uname) && "123456".equals(upwd)){
return true;
}
return false;
}
}
public class WeiChar extends Model{
@Override
public boolean login(String uname, String upwd) {
if("1339876".equals(uname) && "123456".equals(upwd)){
return true;
}
return false;
}
}
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("欢迎来到王者荣耀");
System.out.println("请选择登录模式:1QQ,2微信");
Scanner sc = new Scanner(System.in);
int cmd = sc.nextInt();
Model model = null;
String uname = null;
String upwd = null;
switch(cmd) {
case 1:
model = new QQ();
System.out.println("请输入qq账号和密码");
uname = sc.next();
upwd = sc.next();
break;
case 2:
model = new WeiChar();
System.out.println("请输入微信账号和密码");
uname = sc.next();
upwd = sc.next();
break;
default:
System.out.println("登录错误");
break;
}
boolean flag = model.login(uname, upwd);
System.out.println("是否登录成功:"+flag);
}
}