·
模板方法模式在王者榮耀中的應用
·
一、簡述
在王者榮耀中,有查看所有英雄功能,並且玩家在查看英雄時可以對英雄的排序做調整。具體而言,玩家可以按照默認排序、名稱排序、熟練度排序、上架時間排序、榮耀戰力排序等排序方式使英雄按照不同位置排列。
在本實例中,我們將通過這一簡單實例來說明,抽象模板中定義的具體方法——鉤子方法。具體而言,我們將英雄事先輸入到文本中,並通過英雄的名稱按照字母排序方式的名稱排列。
具體做法:①讀取文件內容;②統計出文件內容中的全部單詞;③將單詞按照字母順序排序,允許具體模板對排序掛鉤,即具體模板可以對單詞排序也可以不對單詞排序;④輸出全部的單詞。
二、模板方法模式(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【小喬】
運行結果截圖
更多設計模式在王者榮耀中的應用請點擊我的→設計模式在王者榮耀中的應用專欄。
歡迎留言,一起學習交流~
感謝閱讀