·
模板方法模式在王者荣耀中的应用
·
一、简述
在王者荣耀中,有查看所有英雄功能,并且玩家在查看英雄时可以对英雄的排序做调整。具体而言,玩家可以按照默认排序、名称排序、熟练度排序、上架时间排序、荣耀战力排序等排序方式使英雄按照不同位置排列。
在本实例中,我们将通过这一简单实例来说明,抽象模板中定义的具体方法——钩子方法。具体而言,我们将英雄事先输入到文本中,并通过英雄的名称按照字母排序方式的名称排列。
具体做法:①读取文件内容;②统计出文件内容中的全部单词;③将单词按照字母顺序排序,允许具体模板对排序挂钩,即具体模板可以对单词排序也可以不对单词排序;④输出全部的单词。
二、模板方法模式(Template Method Pattern)
模板方法模式理解:
高度概括:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
类中的方法用以表明该类的实例所具有的行为,一个类可以有许多方法,而且类中的实例方法也可以调用该类中的其它若干个方法,在编写类的时候,可能需要将类的许多方法集成到一个实例方法中,即用一个实例方法封装若干个方法的调用,以此表示一个算法的骨架,也就是说,调用该实例方法相当于按着一定顺序执行若干个方法。
模板方法是关于怎样将若干个方法集成到一个方法中,以便形成一个解决问题的算法骨架。模板方法模式的关键是在一个抽象类中定义一个算法的骨架,即将若干个方法集成到一个方法中,并称该方法为一个模板方法,或简称为模板,模板方法所调用的其他方法通常为抽象的方法,这些抽象的方法相当于算法骨架中的各个步骤,这些步骤的实现可以有子类去完成。
模板方法模式结构中的两种角色:
①抽象模板(Abstract Template):抽象模板是一个抽象类。抽象模板定义了若干个方法以表示一个算法的各个步骤,这些方法中有抽象方法也有非抽象方法,其中的抽象方法称作原语操作(Primitive Operation)。重要的一点是,抽象模板中还定义了一个称作模板方法的方法,该方法不仅包含有抽象模板中表示算法步骤的方法调用,而且也可以包含有定义在抽象模板中的其它对象的方法调用,即模板方法定义了算法的骨架;
②具体模板(Concrete Template):具体模板是抽象模板的子类,实现抽象模板中的原语操作。
模板方法模式的UML类图:
模板方法模式的优缺点:
优点:
①可以通过在抽象模板定义模板方法给出成熟的算法步骤,同时又不限制步骤的细节,具体模板实现算法细节不会改变整个算法的骨架;
②在抽象模板模式中,可以通过钩子方法对某些步骤进行挂钩,具体模板通过钩子可以选择算法骨架中的某些步骤;
缺点:
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
模板方法模式的适用情景:
①设计者需要给出一个算法的固定步骤,并将某些步骤的具体实现留给子类来实现;
②需要对代码进行重构,将各个子类公共行为提取出来集中到一个共同的父类中以避免代码重复。
三、王者荣耀角度下实现模板方法模式结构图及代码
eclipse结构图
主函数【应用(Application)】
Applicayion.java
package angle_templateMethodPattern;
import angle_templateMethodPattern.DefaultCollation;
import angle_templateMethodPattern.NameSorting;
import angle_templateMethodPattern.SortTemplate;
import java.io.File;
public class Application{
public static void main(String args[]) {
File file=new File("HeroName.txt");
SortTemplate template=new NameSorting(file);
System.out.println("以五个英雄为例");
System.out.println("★★★★★★★★★★★");
System.out.println("①名称排序:");
template.showAllWords();
System.out.println("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
template=new DefaultCollation(file);
System.out.println("②默认排序:");
template.showAllWords();
}
}
抽象模板(Abstract Template)
SortTemplate.java
package angle_templateMethodPattern;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public abstract class SortTemplate{
File file;
String content;
String [] word;
SortTemplate(File file){
this.file=file;
content="";
}
public final void showAllWords(){
readContent();
getWords();
if(isSort())
sort(word);
printWords(word);
}
public boolean isSort(){ //钩子方法
return true;
}
public final void readContent(){
try {
StringBuffer str=new StringBuffer();
FileReader inOne=new FileReader(file);
BufferedReader inTwo= new BufferedReader(inOne);
String s=null;
while((s=inTwo.readLine())!=null)
str.append(s+"\n");
content=new String(str);
inOne.close();
inTwo.close();
}
catch(IOException exp){}
}
public final void getWords(){
//空格字符、数字和符号(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)组成的正则表达式:
String regex="[\\s\\d\\p{Punct}]+";
word=content.split(regex);
}
public void sort(String [] word){} //钩子方法
public final void printWords(String [] word){
for(int i=0;i<word.length;i++){
System.out.printf("%-10s",word[i]);
}
System.out.println();
}
}
具体模板(Concrete Template)
DefaultCollation.java
package angle_templateMethodPattern;
import angle_templateMethodPattern.SortTemplate;
import java.io.File;
public class DefaultCollation extends SortTemplate{
DefaultCollation(File file){
super(file);
}
public boolean isSort(){
return false;
}
}
NameSorting.java
package angle_templateMethodPattern;
import java.util.*;
import java.io.*;
public class NameSorting extends SortTemplate{
NameSorting(File file){
super(file);
}
public void sort(String [] word){
Arrays.sort(word);
}
}
文本内容(txt)
AKe【阿珂】
YunZhongJun【云中君】
DaMo【达摩】
BuZhiHuoWu【不知火舞】
XiaoQiao【小乔】
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏。
欢迎留言,一起学习交流~
感谢阅读