在上一篇中咱們學習了行爲型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行爲型模式的兩個模式, 解釋器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern)。html
簡介java
解釋器模式顧名思義,就是對某事物進行解釋。給定一個語言以後,解釋器模式能夠定義出其文法的一種表示,並同時提供一個解釋器。客戶端可使用這個解釋器來解釋這個語言中的句子。git
解釋器模式其實就是對某事物進行解釋。好比生活中常常用到的計算器,將咱們用的語言轉換成計算器預言,還有咱們編寫代碼時用到的正則表達式等等。《大話設計模式》中對這個模式有個比較有意思的講解,其中示例就是把老闆對不一樣人說相同的話,不一樣的人會理解不一樣。這也說明的解釋器模式核心就是進行解釋。github
解釋器模式主要由這四個角色組成,抽象表達式(Expression)角色、終結符表達式(Terminal Expression)角色、非終結符表達式(Nonterminal Expression)角色和環境(Context)角色。正則表達式
這裏爲了方便理解,咱們使用一個簡單的示例來加以說明。 日常咱們在進行英語學習的時候,會自行翻譯或者用到翻譯工具。可是不一樣的翻譯工具翻譯的結果也可能不同,這時咱們只須要拿到本身想要的結果就好了。好比,使用百度和有道翻譯「好好學習,每天向上!」,它們翻譯的結果分別爲「Study hard and keep up!」和「study hard and make progress every day!」,而xuwujing翻譯的結果是「 Good good study, day day up!」。 那麼咱們即可以用解釋器模式來實現這種場景。 首先定義一個抽象的解釋器接口,有解釋的這個方法,而後再定義不一樣的解釋器實現該接口和方法,最後再來進行測試。那麼代碼以下:sql
interface Expreeion{
void interpert(String word);
}
class BaiduExpreeion implements Expreeion{
String str ="好好學習,每天向上!";
@Override
public void interpert(String word) {
if(str.equals(word)) {
System.out.println("百度翻譯:"+word+" 的英文是 Study hard and keep up!");
}
}
}
class YouDaoExpreeion implements Expreeion{
String str ="好好學習,每天向上!";
@Override
public void interpert(String word) {
if(str.equals(word)) {
System.out.println("有道翻譯:"+word+" 的英文是 study hard and make progress every day!");
}
}
}
class XuWuJingExpreeion implements Expreeion{
String str ="好好學習,每天向上!";
@Override
public void interpert(String word) {
if(str.equals(word)) {
System.out.println("xuwujing翻譯:"+word+" 的英文是 Good good study, day day up!");
}
}
}
public class InterpreterTest {
public static void main(String[] args) {
String word = "好好學習,每天向上!";
Expreeion expreeion =new BaiduExpreeion();
Expreeion expreeion2 =new YouDaoExpreeion();
Expreeion expreeion3 =new XuWuJingExpreeion();
expreeion.interpert(word);
expreeion2.interpert(word);
expreeion3.interpert(word);
}
}
複製代碼
輸出結果:設計模式
百度翻譯:好好學習,每天向上! 的英文是 Study hard and keep up!
有道翻譯:好好學習,每天向上! 的英文是 study hard and make progress every day!
xuwujing翻譯:好好學習,每天向上! 的英文是 Good good study, day day up!
複製代碼
解釋器模式優勢:數組
擴展性好,子類擴展很是方便。 實現簡單。bash
解釋器模式缺點:ide
可以使用的場景比較少; 類過多的話,會使代碼臃腫,難以維護;
使用場景:
一個簡單的語法規則須要解釋的場景,好比sql。 有重複的問題的時候。
簡介
迭代器模式用於順序訪問集合對象的元素,不須要知道集合對象的底層表示,屬於行爲型模式。 它提供一種方法順序訪問一個聚合對象中各個元素, 而又無須暴露該對象的內部表示。
咱們對迭代器(Iterator)確定不陌生,由於咱們在Java開發中會常常用到,好比對List、Set和Map集合進行遍歷或對數組進行遍歷的時候。可是迭代器模式的話,可能就不太理解了,這裏咱們就簡單講講迭代器模式。
迭代器模式主要由這四個角色組成,迭代器角色(Iterator)、具體迭代器角色(Concrete Iterator)、容器角色(Container)和具體容器角色(Concrete Container)。
由於迭代器咱們平時用的比較多,這裏也不在過多描述了,這裏就簡單的介紹下迭代器模式的運做。 首先,定義一個迭代器角色(MyIterator )和容器角色(MyIterable)的接口。 代碼以下:
interface MyIterator {
boolean hasNext();
String next();
}
interface MyIterable{
MyIterator getIterator();
void add(String str);
String get(int index);
}
複製代碼
而後定義一個 具體容器角色(ListContainer )實現容器角色的接口,這裏的實現方法經過List自帶的進行實現;而後再定義一個具體迭代器角色(ListIterator )實現迭代器角色的接口,這裏的實現的方法由本身實現。 那麼代碼以下:
class ListContainer implements MyIterable {
private List<String> list =new ArrayList<>();
@Override
public MyIterator getIterator() {
return new ListIterator();
}
@Override
public void add(String str) {
list.add(str);
}
@Override
public String get(int index) {
return list.get(index);
}
class ListIterator implements MyIterator{
int index;
@Override
public boolean hasNext() {
return index < list.size();
}
@Override
public String next() {
if (this.hasNext()) {
return list.get(index++);
}
return null;
}
}
}
複製代碼
最後再來進行代碼的測試。 測試代碼以下:
public static void main(String[] args) {
MyIterable myIterable = new ListContainer();
myIterable.add("1");
myIterable.add("zhangsan");
myIterable.add("2");
myIterable.add("lisi");
myIterable.add("3");
myIterable.add("xuwujing");
MyIterator myIterator = myIterable.getIterator();
while (myIterator.hasNext()){
String str = myIterator.next();
System.out.println(str);
}
}
複製代碼
輸出結果:
1
zhangsan
2
lisi
3
xuwujing
複製代碼
迭代器模式優勢:
靈活度高,能夠經過不一樣的方式遍歷對象; 擴展性好,能夠很方便的增長新的聚合類和迭代器類而不用修改以前的代碼。
迭代器模式缺點:
因爲迭代器模式將存儲數據和遍歷數據的職責分離,增長新的聚合類須要對應增長新的迭代器類,類的個數成對增長,這在必定程度上增長了系統的複雜性。
使用場景:
須要爲聚合對象提供遍歷的功能的時候。
分享一首很好聽的日語歌曲!
java-study 是本人在學習Java過程當中記錄的一些代碼,也包括以前博文中使用的代碼。若是感受不錯,但願順手給個start,固然若是有不足,也但願提出。 github地址: github.com/xuwujing/ja…
原創不易,若是感受不錯,但願給個推薦!您的支持是我寫做的最大動力! 版權聲明: 做者:虛無境
博客園出處:www.cnblogs.com/xuwujing CSDN出處:blog.csdn.net/qazwsxpcm 我的博客出處:www.panchengming.com