是我沒有理解正確仍是?這個模式爲何要單獨出來。不就是狀態模式的廣度增長版而已嘛?數據結構
我的感受很是少的合適的場景。看狀態模式就行了。同樣的思想。ide
多個狀態的狀態模式 =》多個元素須要分別處理狀態=》多個元素須要有各自的操做=》訪問者模式。ui
//又是一個貌似看懂結構,但沒法理解的模式。 //根據以前的經驗,例子很是重要,狀態模式也是沒法理解,作一個合適的例子,立刻理解。恩。看定義,搞清正確場合,制定正確例子。 //Represent an operation to be performed on the elements of an object structure. //Visitor lets you define a new operation without changing the classes of the elements on which it operates. //表示做用於某結構全部元素的一個操做,它能夠在不改變數據結構的前提下定義做用於這些元素的新的操做。 //fk,不能理解英文,中文本身感受確定是直譯。會對本質含義存在點不破的可能。再找一個解釋吧。 //將做用於某種數據結構中的各元素的操做分離出來封裝成獨立的類,使其在不改變數據結構的前提下能夠添加做用於這些元素的新的操做, //爲數據結構中的每一個元素提供多種訪問方式。它將對數據的操做與數據結構進行分離,是行爲類模式中最複雜的一種模式。 //意思是說,某類的數據不變,可是須要增長新的操做,做用於這些數據。請設計出一個模式。 //忽然想到以前作的我的基因檢測,一我的的基因數據是基本不變,穩定的。可是給不一樣的團隊,不一樣的研究方向,會得出各自領域的數據和結論。 //預感這個例子會失敗。 //失敗,沒有理解訪問者模式的定義。中文翻譯,竟然也看不懂。作完了例子。一點不像訪問者模式。並且沒有發現有任何須要改進的地方。 //若是須要增長新的研究機構,直接新設立類就能夠啊。沒問題啊。。。 //看了一個解釋。原來改變的不是研究所。而是研究所的研究方法。。。。 //這裏:if(item.minfo1==1)若是研究方法須要改變。那麼analyze,就須要改變了。感受有戲。 //命令模式,也是這樣,把方法踢出來,幷包含一個執行方法的主體。組成一個類,就變成了命令模式。 //狀態模式,一樣,把判斷的分支,加上執行主體,組成一個類,就變成了狀態模式。 //莫非這裏,把判斷的分支,加上執行的主體,組成一個類。就變成了訪問者模式? //比較無言的一種模式, // 1.首先被訪問者的數據是固定的,一個或多個均可以,不必定要是集合。我的感受若是隻有一個元素,那就是狀態模式啊。 //2.數據固定,可是對數據的的信息的處理會常常變更。因此if else ,違法了開閉原則,要像狀態模式同樣,放到一個類裏面。 //3.由於是有多個元素,每一個元素,都有至少一個處理類,我的感受就是 多個狀態下的的狀態模式。 //絕對是很是少的合適的場景。並且也沒有必要去看。看狀態模式就行了。同樣的思想。 public class Visister { public void Run() { GeneLibrary linson=new GeneLibrary(Linsongene()); SkinColorStudio skinColorStudio=new SkinColorStudio(); HairStudio hairStudio=new HairStudio(); LSComponentsHelper.LS_Log.Log_INFO(skinColorStudio.analyze(linson)); LSComponentsHelper.LS_Log.Log_INFO(hairStudio.analyze(linson)); } public void Run2() { GeneLibrary linson=new GeneLibrary(Linsongene()); SkinColorStudioV2 skinColorStudioV2=new SkinColorStudioV2(); LSComponentsHelper.LS_Log.Log_INFO(skinColorStudioV2.analyze(linson)); } //region 初版,開始沒看出來須要升級的地方。後來看解釋,變化的是訪問元素的方法,會常常變更。 public List<GeneItem> Linsongene() { List<GeneItem> ret=new LinkedList<>(); GeneItem temp=new GeneItem(1, 3, "ok"); GeneItem temp2=new GeneItem(1, -2, "ok"); GeneItem temp3=new GeneItem(2, 2, "ok"); GeneItem temp4=new GeneItem(2, 1, "ok"); ret.add(temp); ret.add(temp2); ret.add(temp3); ret.add(temp4); return ret; } public class GeneItem { public int minfo1; public int minfo2; public String minfo3; public GeneItem (int i,int i2,String i3) { minfo1=i; minfo2=i2; minfo3=i3; } } public class GeneLibrary { public List<GeneItem> mGeneItems; public GeneLibrary(List<GeneItem> geneItems) { mGeneItems=geneItems; } } public interface IStuido { public String analyze(GeneLibrary geneLibrary); } public class SkinColorStudio implements IStuido { @Override public String analyze(GeneLibrary geneLibrary) { int res=0; for(GeneItem item :geneLibrary.mGeneItems) { if(item.minfo1==1) { //LSComponentsHelper.LS_Log.Log_INFO(item.minfo2+""); res+=item.minfo2; } else { //LSComponentsHelper.LS_Log.Log_INFO(item.minfo2+""); res-=item.minfo2; } } if(res<=0) { return "your sikn is yellow"+res; } else { return "your skin is black"+res; } } } public class HairStudio implements IStuido { @Override public String analyze(GeneLibrary geneLibrary) { int res=0; for(GeneItem item :geneLibrary.mGeneItems) { if(item.minfo1==2) { res+=item.minfo2; } else { res-=item.minfo2; } } if(res>=0) { return "your will be drop you hair in middle"+res; } else { return "congratulation ,you will have a good hair in your life!"+res; } } } //endregion public abstract class AnlyzeItem { protected GeneItem mGeneItem; public AnlyzeItem(GeneItem geneItem) { mGeneItem=geneItem; } public abstract int checkME(); } public class SkinAnlyzeItem1v1 extends AnlyzeItem { public SkinAnlyzeItem1v1(GeneItem geneItem) { super(geneItem); } @Override public int checkME() { if(mGeneItem.minfo1==1) { return mGeneItem.minfo2; } else { return -mGeneItem.minfo2; } } } public class SkinAnlyzeItem2v1 extends AnlyzeItem { public SkinAnlyzeItem2v1(GeneItem geneItem) { super(geneItem); } @Override public int checkME() { if(mGeneItem.minfo1==1) { return mGeneItem.minfo2; } else { return -mGeneItem.minfo2; } } } public class SkinAnlyzeItem3v1 extends AnlyzeItem { public SkinAnlyzeItem3v1(GeneItem geneItem) { super(geneItem); } @Override public int checkME() { if(mGeneItem.minfo1==1) { return mGeneItem.minfo2; } else { return -mGeneItem.minfo2; } } } public class SkinAnlyzeItem4v1 extends AnlyzeItem { public SkinAnlyzeItem4v1(GeneItem geneItem) { super(geneItem); } @Override public int checkME() { if(mGeneItem.minfo1==1) { return mGeneItem.minfo2; } else { return -mGeneItem.minfo2; } } } public class SkinColorStudioV2 implements IStuido { @Override public String analyze(GeneLibrary geneLibrary) { int res=0; int index=0; //這裏仍是有if,可是注意假設,訪問者模式是假設數據不變的。因此這裏的if結構是不會在變的。就4個元素。 //變化的是具體方法。因此把方法踢倒一個類裏面。而且把元素也給他。 for(GeneItem item :geneLibrary.mGeneItems) { if(index==0) { SkinAnlyzeItem1v1 skinAnlyzeItem1v1=new SkinAnlyzeItem1v1(item); res+=skinAnlyzeItem1v1.checkME(); } else if(index==1) { SkinAnlyzeItem2v1 skinAnlyzeItem2v1=new SkinAnlyzeItem2v1(item); res+=skinAnlyzeItem2v1.checkME(); } else if(index==2) { SkinAnlyzeItem3v1 skinAnlyzeItem3v1=new SkinAnlyzeItem3v1(item); res+=skinAnlyzeItem3v1.checkME(); } else if(index==3) { SkinAnlyzeItem4v1 skinAnlyzeItem4v1=new SkinAnlyzeItem4v1(item); res+=skinAnlyzeItem4v1.checkME(); } index++; } if(res<=0) { return "your sikn is yellow:"+res; } else { return "your skin is black"+res; } } } //region //endregion }