版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
單例類圖singleton私有的構(gòu)造方加載時(shí)候,就實(shí)例化一個(gè)對(duì)交給自己的而懶漢在調(diào)用取得實(shí)例方法的時(shí)候會(huì)實(shí)例化對(duì)象。碼如下:餓漢式單publicpublicclassSingletonprivateSingleton(){}publicstaticSingleton}}懶漢式單publicpublicclassSingletonprivateSingleton(){}publicstaticsynchronizedSingletonsingleton=new}return}}單例模式的優(yōu)點(diǎn)避免頻繁的創(chuàng)建銷毀對(duì)象可以全局需要頻繁實(shí)例化然后銷毀的有狀態(tài)的工具類對(duì)象頻繁數(shù)據(jù)庫(kù)或文件的對(duì)象不要做斷開(kāi)單例類對(duì)象與類中靜態(tài)的操作看到不少資料中說(shuō):如果一單例對(duì)象在內(nèi)存長(zhǎng)久不,會(huì)被jvm認(rèn)為一個(gè),執(zhí)行收的時(shí)會(huì)清理掉。對(duì)此這個(gè)說(shuō)法,筆持懷疑態(tài)度,筆本人的點(diǎn)是:在hotspot虛擬機(jī)1.6版本中,為斷開(kāi)單例中靜態(tài)到單例對(duì)象的接,否則jvm收集器是不會(huì)回收單例對(duì)象的。在一個(gè)jv中會(huì)出現(xiàn)多個(gè)單例vm中,會(huì)不會(huì)產(chǎn)生單例呢?使用單例提供的geInstance()方法只能得到同一個(gè)單例,除非是使用反射方式,將會(huì)得到新的單例。代碼如下Classc=Class.forName(Singleton.class.getName());Constructorct=c.getDeclaredConstructor();Classc=Class.forName(Singleton.class.getName());Constructorct=c.getDeclaredConstructor();Singletonsingleton=主要是網(wǎng)上的一些說(shuō)法,懶漢式的單例模式是線程不安全的,即使是在實(shí)例化對(duì)象的方法上加synchronize字,也依然是的,但是筆者經(jīng)過(guò)編碼測(cè)試,發(fā)現(xiàn)加synchronize關(guān)鍵字修飾后,雖然對(duì)性能有部分影響,但單例類可以被繼餓漢式單例好還是懶漢式單在java中,餓漢式單例要優(yōu)于懶漢式單例。C++中則一般使用懶漢式單例。工廠方法類圖!1.2factory工廠方法模式代}classProductimplementspublicvoidproductMethod}}publicIProduct}classFactoryimplements{publicIProductcreateProduct(){returnnewProduct();}}}{IFactoryfactory=newFactory();IProductprodect=factory.createProduct();}}工廠模式想要的產(chǎn)品。工廠方法模式少個(gè)具體的工廠實(shí)現(xiàn)。抽象類來(lái)代替,但要注意最不要里氏替原則。適用場(chǎng)景首先,作為一種創(chuàng)建類模式,在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠模式,而簡(jiǎn)單對(duì)象,特別是只需要通過(guò)nw就可以完成創(chuàng)建的對(duì)象,無(wú)需使用工廠典型classclassEngine{publicvoidgetStyleSystem.out.println("這是汽車}}classUnderpan{publicvoidgetStyleSystem.out.println("這是}}classWheel{publicgetStyleSystem.out.println("這是}}WheelWheelwheel=newICarcar=newCar(underpan,wheel,engine);}}的,嚴(yán)重了迪法則,耦合度太高。并且非常不利于擴(kuò)展。另外,本例中發(fā)動(dòng)機(jī)、底盤(pán)和輪胎還是比較interfaceIFactory{interfaceIFactory{}classFactoryimplements{publicICarcreateCar(){Engineengine=newEngine();Underpanunderpan=newUnderpan();Wheelwheel=newWheel();ICarcar=newCar(underpan,wheel,engine);returncar;}}{IFactoryfactory=newFactory();ICarcar=factory.createCar();}}抽象工廠類圖1.3 在抽象工廠模式中,有一個(gè)產(chǎn)品族的概念:所謂的產(chǎn)品族,是指位于不同產(chǎn)品等級(jí)結(jié)構(gòu)能相關(guān)聯(lián)的產(chǎn)品組成的。抽象工廠模式所提供的一系列產(chǎn)品就組成一個(gè)產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個(gè)等級(jí)結(jié) 2.4.4兩廂車和2.4抽象工廠模式代interfaceinterface{publicvoid}interface{publicvoid}}}classProduct2implements{publicvoidshow(){}}}classFactoryimplementsIFactory{publicIProduct1createProduct1(){returnnew}{returnnew}}publicstaticvoidmain(String[]args){IFactoryfactory=new抽象工廠模式的適用一個(gè)繼承體系中,如果存在著多個(gè)等級(jí)結(jié)構(gòu)(即存在著多個(gè)抽象類),并且分屬各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間總建造者類圖1.5builder-pattern代碼classProduct{privateclassProduct{privateStringname;privateStringtype;publicvoidshowProduct(){}publicvoidsetName(String{=}{this.type=}} ProductgetProduct();}classConcreteBuilderextends{privateProductproduct=new{return}}}privateBuilderbuilder=newConcreteBuilder();publicProductgetAProduct(){returnbuilder.getProduct();}public奧迪汽車","Q5return}}Productproduct1=director.getAProduct();Productproduct2=director.getBProduct();}}}建造者模式的優(yōu)廠類向客戶端提供最終的產(chǎn)品;而建造者模式中,建造者類一般只提品類中各個(gè)組件的建造,而將具體建總原型類圖原型模式主要用于對(duì)象的,它的是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個(gè)條實(shí)現(xiàn)Cloneable接口。在java語(yǔ)言有一個(gè)Cloneable接口,它的作用只有一個(gè),就是在運(yùn)行時(shí)通知虛擬機(jī)可clonejavaCloeNtSupotedxceti重寫(xiě)Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個(gè)clone方法,作用是返回對(duì)象的一個(gè)拷貝,但是其作用域protectd類型的,一般的類無(wú)法調(diào)用,因此,Prototype類需要將clone方法的作用域修改為public類型。實(shí)現(xiàn)代碼classclassPrototypeimplements{publicPrototypeclone(){Prototypeprototype=null;prototype=}catch(CloneNotSupportedException}return}}classConcretePrototypeextendsPrototype{publicvoidshow(){}}publicstaticvoidmain(String[]args){ConcretePrototypecp=newConcretePrototype();for(inti=0;i<10;i++){ConcretePrototypeclonecp=(ConcretePrototype)cp.clone();}}}原型模式的優(yōu)點(diǎn)及適用場(chǎng)使用原型模式創(chuàng)建對(duì)象比直接new一個(gè)對(duì)象在性能上要好的多,因?yàn)镺bject類的clone方法是一個(gè)本地方法,它直接操作內(nèi)存中的二進(jìn)制流特別是大對(duì)時(shí),性的差別非常明顯。原型模式的注意深拷貝與淺拷貝。Objet類的clone方法只會(huì)拷貝對(duì)象中的基本的數(shù)據(jù)類型,對(duì)于數(shù)組、容器對(duì)象、對(duì)象等都不會(huì)拷貝,這就是淺拷貝。如果要實(shí)現(xiàn)深拷貝,必須將原型模式中的數(shù)組、容器對(duì)象、對(duì)象等行拷貝。例如:publicpublicclassPrototypeimplements{privateArrayListlist=newArrayList();publicPrototypeclone(){Prototypeprototype=null;prototype=(Prototype)super.clone();e){e.printStackTrace();}return}}由于ArrayList不是基本類型,所以成員變量list,不會(huì)被拷貝,需要我們自己實(shí)現(xiàn)深拷貝,幸運(yùn)的是java類都實(shí)現(xiàn)了Cloneable接口。所以實(shí)現(xiàn)深拷貝并不是特別。模版方法ASort@param publicvoidarray){this.sort(array);for(inti0iarray.length;}}}} classclassConcreteSort{protectedvoidarray){for(inti=0;1;selectSort(array,}}privatevoidselectSort(int[]array,int{intMinValue=32767;//最小值intindexMin=0;//最小值索引變intTemp;//暫存變for(inti=index;i<array.length;{if(array[i]<MinValue){//找到最小MinValue=array[i];// 最小indexMin=}}Temp=array[index];//交換兩數(shù)值array[index]=array[indexMin];array[indexMin]=Temp;}}<pre<preclass="java"name="code">publicclassClientpublicstaticinta1032195712043預(yù)設(shè)數(shù)據(jù)數(shù)publicstaticvoidmain(String[]}}運(yùn)行結(jié)果01345791012模版方法模式的模版方法的優(yōu)點(diǎn)及適用場(chǎng)中介者為什么要使用中發(fā)生變化,那么將會(huì)有4251.9mediator-我們使用一個(gè)例子來(lái)說(shuō)明一下什么是同事類:有兩個(gè)類A和B,類中各有一個(gè)數(shù)字,并且要保證類B中的數(shù)字是類A中數(shù)字的100倍。也就是說(shuō),當(dāng)修改類A的數(shù)時(shí),將這個(gè)數(shù)字乘以100賦給類B,而修改類B時(shí),要將數(shù)除以100賦給類A。類A類B互相影響,就稱為同事類。代碼如下:{protectedint{return}publicvoidsetNumber(intnumber){this.number=number;} voidsetNumber(int Colleague}classColleagueA publicvoidsetNumber(int Colleague{this.number=number;}}classColleagueB publicvoidsetNumber(int Colleague{this.number=number;}}ColleaguecollA=newColleagueA();ColleaguecollB=new }}上面的代碼中,類A類B通過(guò)直接的關(guān)聯(lián),假如我們要使用中介者模式,類A類B之間則不可以直接關(guān) {protectedint{return}publicvoidsetNumber(intnumber){this.number=number;} voidsetNumber(int Mediator}classColleagueA publicvoidsetNumber(int Mediator{this.number=number;}}classColleagueB publicvoidsetNumber(int Mediator{this.number=number;}} { Colleague Colleague Colleague Colleagueb)A=B=} void void}classMediator Mediatorpublic Colleague Colleague{super(a,}intnumber=A.getNumber();}intnumber=B.getNumber();}} ColleaguecollA=new ColleaguecollB=newMediatoram=newMediator(collA, }}中介者模式的優(yōu)以使原凌亂對(duì)象系清,但是果,則能帶來(lái)反效果一般說(shuō),有對(duì)于種同類之中介者模式是一種比較常用的模式,也是一種比較容易被的模式。對(duì)于大多數(shù)的情況,同事類之間的關(guān)系會(huì)復(fù)雜到的網(wǎng)狀結(jié)構(gòu),因此,大多數(shù)情況下,將對(duì)象間的依賴關(guān)系封裝的同事類內(nèi)部就可以的,沒(méi)有要非引入中介者模式。觀察者如,我們要設(shè)計(jì)一個(gè)自動(dòng)部署的功能,就像eclipse開(kāi)發(fā)時(shí),只要修改了文件,eclipse署到服務(wù)器中。這兩個(gè)功能有一個(gè)相似的地方,那就是一個(gè)對(duì)象要時(shí)刻著另一個(gè)對(duì)象,只要它的狀態(tài)一發(fā)的選擇。觀察者模式的結(jié)被觀察者:從類圖中可以看到,類中有一個(gè)用來(lái)存放觀察者對(duì)象的Vector容器(之所以使用VectorList,是因?yàn)槎嗑€程操作時(shí),Vector在是安全的,而List則是不安全的),這個(gè)Vector容器是被觀察者,另外還有三個(gè)方法:attach方法是向這個(gè)容器中添加觀察者對(duì)象;detach方法是從容器中移除觀察者對(duì)象;otiy觀察者:觀察者角色一般是一個(gè)接口,它只有一個(gè)update被觸發(fā)調(diào)用。觀察者模式代碼privateVectorobs=newpublicvoidaddObserver(Observerobs){this.obs.add(obs);}publicvoiddelObserver(Observerobs){this.obs.remove(obs);}protectednotifyObserver(){for(Observer}} void}classConcreteSubjectextends{publicvoiddoSomething(){}}interface{publicvoid}classConcreteObserver1implements{publicvoidupdate()}}classConcreteObserver2implements{publicvoidupdate()}}publicstaticvoidmain(String[]args){Subjectsub=newsub.addObserver(newConcreteObserver1());//添加觀察者1sub.addObserver(newConcreteObserver2());//添加觀察者2}運(yùn)行被觀察者事件反觀察者2收到信息,并通過(guò)運(yùn)行結(jié)果可以看到,我們只調(diào)用了Subject的方法,但同時(shí)兩個(gè)觀察者的相關(guān)方法都被同時(shí)調(diào)用了。仔細(xì)看一下代碼,其實(shí)很簡(jiǎn)單,無(wú)非就是在ubjet類中關(guān)聯(lián)一下Observr類,并且在dSomethng方法中遍歷一下sev的pae觀察者模式的優(yōu)構(gòu)中,比較容易出現(xiàn)循環(huán)的錯(cuò)誤,造成系假死??傋鲞^(guò)VC++、javascriptDOM或者AWT開(kāi)發(fā)的朋友都對(duì)它們的事件處理感到神奇,了解了觀察者模式,就對(duì)事?lián)?,AWT中的事件處理DEM(委派事件模型DelegationEventModel)就是使用觀察者模式實(shí)現(xiàn)的。者模式classclassA{publicvoidmethod1(System.out.println("我是}publicvoidmethod2(Bb){}}classBpublicvoidshowA(Aa){}}args){Aa=newA();a.method2(newB());}}看懂了這個(gè)例子,就理解了者模式的90%,在例子中,對(duì)于類A來(lái)說(shuō),類B就是一個(gè)者。但是這個(gè)例子并不是者模式的全部,雖直觀,但是它的擴(kuò)展性較差,下面我們就來(lái)說(shuō)一下者模式的通用現(xiàn),通過(guò)類圖可以看到,在者式中,主要包括面幾個(gè)色:**抽象者:**抽象類或者接口,者可以哪些元素,具體到程序中就是visit方法中的參數(shù)定List、Set、MapclassElement void}}classConcreteElement1extends{publicvoiddoSomething(){}{}}classConcreteElement2extends{publicvoiddoSomething(){}{}}{}{}}class{publicstaticListListlist=newArrayList();Randomran=newRandom();intinta=list.add(newlist.add(new}}return}} =for(Elemente:list){e.accept(newVisitor());}}**者模式的適用場(chǎng)景但是,者式并是那完美,也有致命缺:增加的元類比通過(guò)者模的代可以看到在者類,每個(gè)元素都有對(duì)應(yīng)處方法,就是,每加一元素類需要改者類(也包括者類的子類者實(shí)現(xiàn)類),改起相麻煩。就是,在素類目不確的情下,慎用者模式。所以,者模式比較適用對(duì)已有能的重構(gòu),比如說(shuō),一個(gè)項(xiàng)的基本功能已經(jīng)定下者模式對(duì)原有的代碼進(jìn)行重構(gòu)一遍,這樣一來(lái),就可以在不修改各個(gè)元素類的情況下,對(duì)原有功能進(jìn)行修改總正如《設(shè)計(jì)模式》的作者GoF對(duì)者模式的描述:大多數(shù)情況下,你并需要使用者模式,但是當(dāng)你一旦需要使用它時(shí),那你就是真的需要它了。當(dāng)然這只是針對(duì)真正的大牛而言。在現(xiàn)實(shí)情況下(至少是我所處的環(huán)境當(dāng)中),很多人往往沉迷于設(shè)計(jì)模式,他們使用一種設(shè)計(jì)模式時(shí),從來(lái)不去認(rèn)真考慮所使用的模式是否適合這種場(chǎng)景,而往往只是想展示一下自己對(duì)面向?qū)ο笤O(shè)計(jì)的駕馭能力。編程時(shí)有這種心理,往往會(huì)發(fā)生設(shè)計(jì)模式的情況。所以,在學(xué)習(xí)設(shè)計(jì)模式時(shí),一定要理解模式的適用性。必須做到使用一種模式是因?yàn)榱私馑膬?yōu)點(diǎn),不使用一種模式是因?yàn)榱私馑谋锥?;而不是使用一種模式是因?yàn)椴涣私馑谋锥?,不使用一種模式是因?yàn)椴涣私馑膬?yōu)點(diǎn)。命令vk類:調(diào)用者,負(fù)責(zé)調(diào)用 classInvokerprivateCommandpublicvoidmand(Command mand=}public }}class{public } mandextends{privateReceiverreceiver; receiver){this.receiver=}publicvoid{}}classReceiver{publicvoiddoSomething(){System.out.println("接受}}publicstaticvoidmain(String[]args){Receiverreceiver=newCommandcommand= InvokerinvokernewInvoker();}}命令模式的優(yōu)缺令,而無(wú)需知道命令具體是怎么執(zhí)行的。比一組文件操作令:新建文件、文件、刪除文件。如果則無(wú)需知道??晒┱{(diào)用,也有大量令類可供調(diào)用,代碼的復(fù)用性很好。比如,文件的操作中,我們需要增加一個(gè)剪切文令,則只需要把文件和刪除文件這兩個(gè)命令組合一下就行了,非常方便命令模式的適用并不,我們大可以在真需要用到的時(shí)候?qū)ο到y(tǒng)行一下,引入這個(gè)設(shè)計(jì)模式。一個(gè)方法中,這個(gè)封裝的方可以稱之為命令但不是令模式。到底要這種計(jì)上升到模式的度就要責(zé)任連首先來(lái)看一段代request){if(i==1){}elseif(i{}elseif(i{}elseif(i{}}1或者是否為2,ifels就沒(méi)法看了。耦合度高:如果我們想繼續(xù)添加處理請(qǐng)求的類,那么就要繼續(xù)添加elseif判定條件;另外,這個(gè)條件判定的既然缺點(diǎn)我們已經(jīng)清楚了,就要想辦法來(lái)解決。這個(gè)場(chǎng)景的業(yè)務(wù)邏輯很簡(jiǎn)單:如果滿足條件1,則由Handle1來(lái)處理,不滿足則向下傳遞;如果滿足條件2,則由Handler2來(lái)處理,不滿足則繼續(xù)向下傳遞,以此類推,直到條責(zé)任連模式的結(jié)抽象處理類:抽象處理類中主要包含一個(gè)指向下一處理類的成員變量nextHandler和一個(gè)處理請(qǐng)求的方法ndReuet,hadRquet方法的主要主要思想是,如果滿足處理的條件,則有本處理類來(lái)進(jìn)行處理,否則由exHanleclassclassLevelprivateintlevel=0;this.level=level;level){if(this.level>=level.level){returntrue;}return}}class{LevelpublicRequest(Level}publicLevel}}classResponse}class{privateHandlerpublicfinalResponsehandleRequest(Requestrequest){Responseresponse=null;response=this.response(request);if(this.nextHandlernull){ }}return}publicvoidsetNextHandler(Handlerhandler){this.nextHandler=handler;} Responseresponse(Request}classConcreteHandler1extends{protectedLevelgetHandlerLevel(){returnnewLevel(1);}publicResponseresponse(Request{System.out.println("-----請(qǐng)求由處理器1進(jìn)行處 return}}classclassConcreteHandler2extends{protectedLevelgetHandlerLevel(){returnnewLevel(3);}publicResponseresponse(Request{System.out.println("-----請(qǐng)求由處理器2進(jìn)行處 return}}classConcreteHandler3extends{protectedLevelgetHandlerLevel(){returnnewLevel(5);}publicResponseresponse(Request{System.out.println("-----請(qǐng)求由處理器3進(jìn)行處 return}}Handlerhandler1=newConcreteHandler1();Handlerhandler2=newConcreteHandler2();Handlerhandler3=newConcreteHandler3();Responseresponse=handler1.handleRequest(newRequest(new}}代碼中Leve;Requst,ResonseHadlerRequestClent功能與前文中的if…else…語(yǔ)句是一樣的。責(zé)任鏈模式的優(yōu)責(zé)任鏈模式的適用場(chǎng)總責(zé)任模其實(shí)是個(gè)靈版if…lse句是些定的放了處中樣優(yōu)點(diǎn)是比較靈活了,但同樣帶來(lái)了風(fēng)險(xiǎn),比設(shè)置處類前后關(guān)系時(shí),一定要特別細(xì),搞對(duì)處理類后邏輯的條件判斷關(guān)系,并且注意要在鏈中出現(xiàn)循環(huán) 的題。策略類圖替換。面的行為類模式中,有一種模式也是關(guān)注對(duì)算法的封裝——模版方法模式,對(duì)照類圖可以看Context,ontext中,抽象策略Strateg的。策略模式的結(jié)封裝類:也叫上下文,對(duì)策略進(jìn)行二次封裝,目的是避免模塊對(duì)策略的直接調(diào)用interfaceIStrategy{interfaceIStrategy{}classConcreteStrategy1implements{publicvoiddoSomething(){}}classConcreteStrategy2implements{publicvoiddoSomething(){}}classContextpublicContext(IStrategystrategy){this.strategy=}publicexecute(){}}args){Contextcontext; context=newContext(newConcreteStrategy1()); context=newContext(newConcreteStrategy2());}策略模式的優(yōu)缺策略模式的主要各個(gè)策略類會(huì)給開(kāi)發(fā)帶來(lái)額外開(kāi)銷,可能大家在這方面都有經(jīng)驗(yàn):一般來(lái)說(shuō),策略類的數(shù)量超過(guò)5比較令人頭疼了。必須對(duì)客戶端(調(diào)用者)所有的策略類,因?yàn)槭褂媚姆N策略是由客戶端來(lái)決定的,因此,客戶端應(yīng)該道有什么策略,并且了解各種策略之間的區(qū)別,否則,很嚴(yán)重。例如,有一個(gè)排序算法的策略模式,表和數(shù)組有什么區(qū)別?就這點(diǎn)來(lái)說(shuō)是有悖于法的。適用用代碼后,,即使之前從來(lái)沒(méi)有聽(tīng)策略模式,在開(kāi)發(fā)過(guò)程中也一定使用過(guò)它吧?至少在在以下兩種情迭代器類圖publicpublicstaticvoidprint(Collection}}式,Iteator譯成語(yǔ)就迭代器意思提到代,首先是與集相關(guān),集也叫、容等,可以將集合看成是一個(gè)可以包容對(duì)象的容器,例如List,Set,Map,甚至數(shù)組都可以叫做集合,而迭代器的作用迭代器模式的結(jié)抽象容器:一般是一個(gè)接口,提供一個(gè)iterator()方法,例如java中的Collection接口,List接口,Set等。抽象迭代器:定義遍歷元素所需要的方法,一般來(lái)說(shuō)會(huì)有這么三個(gè)方法:取得第一個(gè)元素的方法first下一個(gè)元素的方法next(),判斷是否遍歷結(jié)束的方法isne()(或者叫hasNext()),移出當(dāng)前對(duì)象的方法remove(),代碼interfaceinterface{publicObjectnext();}classConcreteIteratorimplementsIterator{privateListlist=newprivateintcursor=0;}publicbooleanreturnfalse;}return}{Objectobj=null;obj=}return}}interfaceAggregatepublicvoidadd(Objectobj);publicvoidremove(Objectobj);publicIteratoriterator();}classConcreteAggregateimplements{}returnnew}{}}publicstaticvoidmain(String[]args){Aggregateag=newConcreteAggregate();ag.add(" }}}上面的代碼中,Aggregate是容器類接口,大家可以想象一下Collection,List,Set等,Aggregate就是他們的ad、刪除對(duì)象方法removeiteratr。erator是迭代器接口,主要有兩個(gè)方法:取得迭代對(duì)象方法next,判斷是否迭代完成方法hasNext,大家可以對(duì)比java.util.List和java.til.Iteratorhash迭代器模式的缺迭代器模式的適用場(chǎng)解釋器類圖終結(jié)符表達(dá)式:實(shí)現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作,通常一個(gè)解釋器模式中只有一個(gè)終結(jié)符表達(dá)式,但有多個(gè)實(shí)例,對(duì)應(yīng)不同的終結(jié)符。終結(jié)符一半是文法中的運(yùn)算單元,比一個(gè)簡(jiǎn)單的公式R=R1+R2,在里面1R21R2者其他關(guān)鍵字,比如公式R=R1+R2中,+就是非終結(jié)符,解析+的解釋器就是一個(gè)非終結(jié)符表達(dá)式。非終結(jié)環(huán)境角色:這個(gè)角色的任務(wù)一般是用來(lái)存放文法中各個(gè)終結(jié)符所對(duì)應(yīng)的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環(huán)境角色中,很多情況下我們使用Map來(lái)充當(dāng)環(huán)境角色就足夠了。代碼classclassContextclassExpression Objectinterpreter(Context}classTerminalExpressionextends{publicObjectinterpreter(Contextctx){returnnull;}}classNonterminalExpressionextendsExpression{}ctx){returnnull;}}publicstaticvoidmain(String[]args){Stringexpression="";char[]charArray=expression.toCharArray();Contextctx=newContext();Stackstack=newStack();for(inti=0;i}Expressionexp=stack.pop();}}解釋器模式的優(yōu)但是,解釋器模式會(huì)引起類的膨脹,每個(gè)語(yǔ)法都需要產(chǎn)生一個(gè)非終結(jié)符表達(dá)式,語(yǔ)則比較復(fù)雜時(shí),就可能生大量的類文件,為帶來(lái)非常多的麻煩。同時(shí),由于采用遞歸調(diào)用方法,每個(gè)非終結(jié)符表達(dá)式只關(guān)心與自解釋器模式的適用場(chǎng)一些重復(fù)發(fā)生的問(wèn)題,比如加減乘除四則運(yùn)算,但是公式每次都不同,有時(shí)是a+b-cd,有時(shí)是bc-注意解釋器模式真的是一個(gè)比較少用的模式,因?yàn)閷?duì)它的實(shí)在是太麻煩了,想象一下,一坨一坨的非終結(jié)符解等問(wèn)題。備忘錄備忘錄模式的結(jié)classclassOriginatorpublicString{return}{this.state=}publiccreateMemento(){returnnewpublicvoidmemento){}}classMementoprivateStringstate="";publicMemento(Stringstate){}publicString{return}{this.state=}}classCaretakerprivateMementomemento;publicMementogetMemento(){return}publicvoidsetMemento(Mementomemento){this.memento=memento;}}publicstaticvoidmain(String[]args){Originatororiginator=newCaretakercaretaker=newCaretaker();}}代碼演示了一個(gè)單狀態(tài)單備份的例子,邏輯非常簡(jiǎn)單:Originator類中的sate恢復(fù);Memento類中,也有一個(gè)state變量,用來(lái)Originator類中state變量的臨時(shí)狀態(tài);而Caretaker多狀態(tài)多備份備,OriinaorsatejavaBean,Meentap容器來(lái)所有的狀態(tài),在Ca
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院老人心理健康制度
- 養(yǎng)老院老人緊急救援人員職業(yè)發(fā)展規(guī)劃制度
- 質(zhì)量管理體系制度
- 《運(yùn)動(dòng)健康模板》課件
- 房屋權(quán)屬轉(zhuǎn)移合同(2篇)
- 2024年度市政綠化工程土石方施工補(bǔ)充合同6篇
- 2024年教育軟件銷售與授權(quán)合同3篇
- 《修煉執(zhí)行智慧》課件
- 2025年文山道路客貨運(yùn)輸從業(yè)資格證b2考試題庫(kù)
- 2025年昭通下載b2貨運(yùn)從業(yè)資格證模擬考試考試
- (人教版2024版)道德與法治七上第三單元 珍愛(ài)我們的生命 單元復(fù)習(xí)課件
- 結(jié)核性腦膜炎護(hù)理查房課件
- 直播推廣合作合同:2024年主播專屬流量投放合同
- 部編版五年級(jí)語(yǔ)文上冊(cè)快樂(lè)讀書(shū)吧測(cè)試題及答案
- 中建2024裝配式建筑+鋁模一體化施工技術(shù)手冊(cè)
- 2024年工廠車間管理制度(三篇)
- 垃圾填埋場(chǎng)運(yùn)行管理方案
- 2024年業(yè)務(wù)員薪酬管理制度(五篇)
- 【公開(kāi)課】+紀(jì)念與象征-空間中的實(shí)體藝術(shù)+課件高中美術(shù)人美版(2019)美術(shù)鑒賞
- GB/T 44588-2024數(shù)據(jù)安全技術(shù)互聯(lián)網(wǎng)平臺(tái)及產(chǎn)品服務(wù)個(gè)人信息處理規(guī)則
- 2024-2025學(xué)年度北師大版八年級(jí)上冊(cè)物理期中模擬測(cè)試卷
評(píng)論
0/150
提交評(píng)論