![結(jié)構(gòu)型設(shè)計模式_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/9f3b8ee3-f7d7-47da-89d9-2386a96ef512/9f3b8ee3-f7d7-47da-89d9-2386a96ef5121.gif)
![結(jié)構(gòu)型設(shè)計模式_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/9f3b8ee3-f7d7-47da-89d9-2386a96ef512/9f3b8ee3-f7d7-47da-89d9-2386a96ef5122.gif)
![結(jié)構(gòu)型設(shè)計模式_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/9f3b8ee3-f7d7-47da-89d9-2386a96ef512/9f3b8ee3-f7d7-47da-89d9-2386a96ef5123.gif)
![結(jié)構(gòu)型設(shè)計模式_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/9f3b8ee3-f7d7-47da-89d9-2386a96ef512/9f3b8ee3-f7d7-47da-89d9-2386a96ef5124.gif)
![結(jié)構(gòu)型設(shè)計模式_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/9f3b8ee3-f7d7-47da-89d9-2386a96ef512/9f3b8ee3-f7d7-47da-89d9-2386a96ef5125.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、結(jié)構(gòu)型設(shè)計模式適配器模式目錄設(shè)計模式1裝飾模式2代理模式3三個模式對比4設(shè)計模式Round One適配器模式1適配器模式設(shè)計模式二頭插孔三頭插頭+=多么痛的領(lǐng)悟2適配器模式設(shè)計模式3適配器模式設(shè)計模式BSystemA4適配器模式設(shè)計模式n鴨子的接口public interface Duck public void quack(); /鳴叫public void fly(); /飛行n野鴨子類public class MallardDuck implements Duck public void quack() System.out.println(嘎嘎嘎.);public void fly()
2、 System.out.println(我在飛哦!);5適配器模式設(shè)計模式public class DuckTestDrive public static void main(String args) Duck duck = new MallardDuck(); System.out.println(鴨子說.);testDuck(duck);static void testDuck(Duck duck) duck.quack();duck.fly();鴨子說嘎嘎嘎.我在飛哦!6適配器模式設(shè)計模式n火雞的接口public interface Turkey public void gobble()
3、; /火雞鳴叫public void fly(); /火雞飛n野火雞類public class WildTurkey implements Turkey public void gobble() System.out.println(咕咕咕.);public void fly() System.out.println(我在飛,不過飛不遠(yuǎn)。);7適配器模式設(shè)計模式public class DuckTestDrive public static void main(String args) Duck duck = new MallardDuck(); System.out.println(鴨子說.
4、);testDuck(duck); Turkey turkey = new WildTurkey(); System.out.println(“火雞說.); testDuck(turkey);static void testDuck(Duck duck) duck.quack();duck.fly();8適配器模式設(shè)計模式BAdapterSystemAtestDuckTurkeyDuck9適配器模式設(shè)計模式n火雞適配器public class TurkeyAdapter implements Duck Turkey turkey;public TurkeyAdapter(Turkey turk
5、ey) this.turkey = turkey;public void quack() turkey.gobble();public void fly() for(int i=0; i 3; i+) turkey.fly();火雞適配器包裝了一個火雞對象,同時實現(xiàn)了鴨子接口。這樣就可以像使用鴨子一樣使用火雞了。10適配器模式設(shè)計模式public class DuckTestDrive public static void main(String args) Duck duck = new MallardDuck(); System.out.println(鴨子說.);testDuck(duc
6、k); Turkey turkey = new WildTurkey(); Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println(“火雞適配器說.); testDuck(turkeyAdapter);static void testDuck(Duck duck) duck.quack();duck.fly();鴨子說嘎嘎嘎.我在飛哦!火雞適配器說咕咕咕.我在飛,不過飛不遠(yuǎn)。我在飛,不過飛不遠(yuǎn)。我在飛,不過飛不遠(yuǎn)。11適配器模式設(shè)計模式BAdapterSystemAtestDuckTurkeyDuckTurkeyAd
7、apter不需要修改代碼不需要修改代碼新代碼12適配器模式設(shè)計模式GOF對適配器模式的定義是:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。簡單來說,就是需要的東西就在眼前,但卻不能用,而短時間又無法改造它,于是我們就想辦法適配它。13適配器模式設(shè)計模式testDuckWildTurkeyDuckTurkeyAdapter適配器模式結(jié)構(gòu)圖14適配器模式設(shè)計模式適配器模式時序圖WildTurkeyTurkeyAdapter15適配器模式設(shè)計模式適配器模式適用于以下情況:p 當(dāng)想要使用一個已經(jīng)存在的類,但是該類的接口不符合現(xiàn)有的需求
8、時;p 當(dāng)需要創(chuàng)建一個可以被復(fù)用的類,該類能夠與其他無關(guān)的類甚至無法預(yù)見的類協(xié)同工作時;p 當(dāng)需要使用一些已經(jīng)存在的子類,但是不可能對所有的都進行子類化以匹配它們的接口時,對象適配器可以對其父類接口進行適配。16適配器模式設(shè)計模式適配器模式的優(yōu)點如下:p 將目標(biāo)類和適配者類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類,而無需修改原有代碼。p 增加了類的透明性和復(fù)用性,將具體的實現(xiàn)封裝在適配者類中,對于客戶端類來說是透明的,而且提高了適配者的復(fù)用性。p 靈活性和擴展性都非常好,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,完全符合“開閉原則”。設(shè)計模
9、式Round Two裝飾模式17裝飾模式設(shè)計模式場景描述:某漢堡店有一個經(jīng)典產(chǎn)品雞腿漢堡,為了招攬客戶該漢堡店決定開發(fā)新產(chǎn)品。經(jīng)過商討,漢堡店推出了三種新產(chǎn)品黑椒雞腿堡、番茄雞腿堡、沙拉雞腿堡。18裝飾模式設(shè)計模式新產(chǎn)品推出之后,獲得了顧客的一致好評。有一天,漢堡店來了一個顧客,想要一個黑椒沙拉雞腿堡,這可難壞了服務(wù)員,店里沒有這個品種的漢堡。19裝飾模式設(shè)計模式20裝飾模式設(shè)計模式場景描述:某漢堡店有一個經(jīng)典產(chǎn)品雞腿漢堡,為了招攬客戶該漢堡店決定開發(fā)新產(chǎn)品。經(jīng)過商討,漢堡店推出了三種新產(chǎn)品黑椒雞腿堡、番茄雞腿堡、沙拉雞腿堡。新產(chǎn)品推出之后,獲得了顧客的一致好評。有一天,漢堡店來了一個顧客,想
10、要一個黑椒番茄雞腿堡,這可難壞了服務(wù)員,店里沒有這個品種的漢堡。經(jīng)過商討,漢堡店改變了經(jīng)營策略,不再對漢堡品種進行分類,事先制作好原味雞腿漢堡,后續(xù)采用添加醬料的方式進行銷售,顧客可以自主選擇漢堡需要的醬料組合。21裝飾模式設(shè)計模式如何給漢堡添加醬料?裝飾模式來幫忙!裝飾模式設(shè)計模式public class ChickenBurger extends Hamburger Overridepublic void makeHamburger() System.out.println(雞腿漢堡準(zhǔn)備好了);public class Condiment extends Hamburger protect
11、ed Hamburger hamburger;public void SetHamburger(Hamburger hamburger)this.hamburger = hamburger;Overridepublic void makeHamburger() if(hamburger != null) hamburger.makeHamburger();public abstract class Hamburger public abstract void makeHamburger();2223裝飾模式設(shè)計模式public class BlackPepper extends Condime
12、nt private void AddBlackPepper()System.out.println(加黑胡椒);public void makeHamburger()super.makeHamburger();AddBlackPepper();public class Ketchup extends Condiment private void AddKetchup()System.out.println(加番茄醬);public void makeHamburger()super.makeHamburger();AddKetchup();public class Salad extends
13、 Condiment private void AddSalad()System.out.println(加沙拉);public void makeHamburger()super.makeHamburger();AddSalad();ChickenBurger chichenBurger = new ChickenBurger();BlackPepper blackPepper = new BlackPepper();Salad salad = new Salad();blackPepper.SetHamburger(chichenBurger);salad.SetHamburger(chi
14、chenBurger);blackPepper.makeHamburger();salad.makeHamburger();雞腿漢堡準(zhǔn)備好了加黑胡椒雞腿漢堡準(zhǔn)備好了加沙拉24裝飾模式設(shè)計模式GOF對裝飾模式的定義是:動態(tài)地給一個對象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活??蛻舳瞬⒉粫X得對象在裝飾前和裝飾后有什么不同。裝飾模式可以在不使用創(chuàng)造更多子類的情況下,將對象的功能加以擴展。裝飾模式設(shè)計模式2526裝飾模式設(shè)計模式ChickenBurger BlackPepper 27裝飾模式設(shè)計模式裝飾模式適用于以下情況:p 在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對
15、象添加職責(zé)。p 需要動態(tài)地給一個對象增加功能,這些功能也可以動態(tài)地被撤銷。p 當(dāng)不能采用繼承的方式對系統(tǒng)進行擴充或者采用繼承不利于系統(tǒng)擴展和維護時。不能采用繼承的情況主要有兩類:第一類是系統(tǒng)中存在大量獨立的擴展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長;第二類是因為類定義不能繼承(如final類).28裝飾模式設(shè)計模式裝飾模式的優(yōu)點如下:p 裝飾模式與繼承關(guān)系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。p 可以通過一種動態(tài)的方式來擴展一個對象的功能,通過配置文件可以在運行時選擇不同的裝飾器,從而實現(xiàn)不同的行為。p 通過使用不同的具體裝飾類以及這些裝飾類
16、的排列組合,可以創(chuàng)造出很多不同行為的組合??梢允褂枚鄠€具體裝飾類來裝飾同一對象,得到功能更為強大的對象。p 具體構(gòu)件類與具體裝飾類可以獨立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合“開閉原則”。29裝飾模式設(shè)計模式裝飾模式的缺點如下:p 使用裝飾模式進行系統(tǒng)設(shè)計時將產(chǎn)生很多小對象,這些對象的區(qū)別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,同時還將產(chǎn)生很多具體裝飾類。這些裝飾類和小對象的產(chǎn)生將增加系統(tǒng)的復(fù)雜度,加大學(xué)習(xí)與理解的難度。p 這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很
17、困難,對于多次裝飾的對象,調(diào)試時尋找錯誤可能需要逐級排查,較為煩瑣。設(shè)計模式Round Three代理模式30代理模式設(shè)計模式場景描述:有一個紅酒生產(chǎn)廠開業(yè)了,該紅酒生產(chǎn)廠的每天的工作如下:接收消費者的訂單統(tǒng)計訂單生產(chǎn)紅酒銷售紅酒漸漸地,紅酒廠商發(fā)現(xiàn)自己的經(jīng)營越來越困難,消費者的訂單過于零散,接收和統(tǒng)計訂單耗時又耗力,直接影響到了廠商生產(chǎn)紅酒的精力,此外每次收到一個小的訂單就要啟動設(shè)備生產(chǎn)紅酒相當(dāng)耗費資源。經(jīng)過商討,紅酒廠商決定招收一批代理商。讓代理商去處理消費者的訂單,而紅酒廠商只負(fù)責(zé)生產(chǎn)紅酒和提供紅酒給代理商。31代理模式設(shè)計模式32代理模式設(shè)計模式public class RealRed
18、WineFactory implements IWineFactory Overridepublic void product() System.out.println(紅酒工廠生產(chǎn)紅酒.);public interface IWineFactory public void product();/生產(chǎn)酒的方法33代理模式設(shè)計模式public class RedWineProxy implements IWineFactory private final IWineFactory redWine;public RedWineProxy(IWineFactory redWine) this.red
19、Wine = redWine;public void preRequest() System.out.println(代理商處理訂單.);System.out.println(代理商向廠商提供總訂單.);public void afterRequest() System.out.println(代理商從廠商提貨,然后以較高價格出售,賺取一定的差價.);Overridepublic void product() preRequest();this.redWduct();afterRequest();34代理模式設(shè)計模式public class MainWine public sta
20、tic void main(String args) RealRedWineFactory realRedWineFactory = new RealRedWineFactory();RedWineProxy redWineProxy = new RedWineProxy(realRedWineFactory);redWinePduct();代理商處理訂單.代理商向廠商提供總訂單.紅酒工廠生產(chǎn)紅酒.代理商從廠商提貨,然后以較高價格出售,賺取一定的差價.35代理模式設(shè)計模式GOF對代理模式的定義是:為其他對象提供一種代理以控制對這個對象的訪問。36代理模式設(shè)計模式37代理模式設(shè)計
21、模式38代理模式設(shè)計模式代理模式的要點:1、要讓代理對象和被代理對象同時實現(xiàn)一個接口2、要讓代理對象的類中持有被代理對象的引用39Java反射機制設(shè)計模式 靜態(tài)語言 動態(tài)語言Java、C#編譯時進行類型檢查javaScript、Ruby類型檢查在運行時進行40Java反射機制設(shè)計模式 什么是反射? 反射有什么用? 在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。1,在運行時判斷任意一個對象所屬的類;2,在運行時構(gòu)造任意一個類的對象;3,在運行時判斷任意一
22、個類所具有的成員變量和方法;4,在運行時調(diào)用任意一個對象的方法;5,生成動態(tài)代理41Java反射機制設(shè)計模式 接口AnnotatedElement表示目前正在此 VM 中運行的程序的一個已注釋元素。GenericArrayTypeGenericArrayType 表示一種數(shù)組類型,其組件類型為參數(shù)化類型或類型變量。GenericDeclaration聲明類型變量的所有實體的公共接口。InvocationHandlerInvocationHandler 是代理實例的調(diào)用處理程序 實現(xiàn)的接口。Member成員是一種接口,反映有關(guān)單個成員(字段或方法)或構(gòu)造方法的標(biāo)識信息。Parameterized
23、TypeParameterizedType 表示參數(shù)化類型,如 Collection。TypeType 是 Java 編程語言中所有類型的公共高級接口。TypeVariableTypeVariable 是各種類型變量的公共高級接口。WildcardTypeWildcardType 表示一個通配符類型表達式,如 ?、? extends Number 或 ? super Integer。 與反射有關(guān)的所有接口以及類都在java.lang.reflect包里42Java反射機制設(shè)計模式類AccessibleObjectAccessibleObject 類是 Field、Method 和 Constr
24、uctor 對象的基類。ArrayArray 類提供了動態(tài)創(chuàng)建和訪問 Java 數(shù)組的方法。ConstructorConstructor 提供關(guān)于類的單個構(gòu)造方法的信息以及對它的訪問權(quán)限。FieldField 提供有關(guān)類或接口的單個字段的信息,以及對它的動態(tài)訪問權(quán)限。MethodMethod 提供關(guān)于類或接口上單獨某個方法(以及如何訪問該方法)的信息。ModifierModifier 類提供了 static 方法和常量,對類和成員訪問修飾符進行解碼。ProxyProxy 提供用于創(chuàng)建動態(tài)代理類和實例的靜態(tài)方法,它還是由這些方法創(chuàng)建的所有動態(tài)代理類的超類。ReflectPermission反射操
25、作的 Permission 類。43代理模式設(shè)計模式動態(tài)代理:與靜態(tài)代理類對照的是動態(tài)代理類,動態(tài)代理類的字節(jié)碼在程序運行時由Java反射機制動態(tài)生成,無需程序員手工編寫它的源代碼。動態(tài)代理不僅簡化了編程工作,而且提高了軟件系統(tǒng)的可擴展性,因為Java 反射機制可以生成任意類型的動態(tài)代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 接口提供了生成動態(tài)代理類的能力。 44代理模式設(shè)計模式動態(tài)代理主要是一個類和一個接口 InvocationHandler接口 Proxy類45代理模式設(shè)計模式Proxy類是專門完成代理的操作類,可以通過此類為一個或多
26、個接口動態(tài)地生成實現(xiàn)類,此類提供了如下的操作方法: public static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h) 參數(shù)說明: ClassLoader loader:類加載器 Class interfaces:得到全部的接口 InvocationHandler h:得到InvocationHandler接口的子類實例 Proxy類:類:46代理模式設(shè)計模式JDK動態(tài)代理中包含一個類和一個接口: public interface InvocationHandler p
27、ublic Object invoke(Object proxy,Method method,Object args) 參數(shù)說明: Object proxy:指被代理的對象。 Method method:要調(diào)用的方法 Object args:方法調(diào)用時所需要的參數(shù)InvocationHandler接口:接口:47代理模式設(shè)計模式48代理模式設(shè)計模式redWinePduct()方法被調(diào)用redWinePduct( )invoke(Object proxy, Method method, Object args)redWineProxy會接著調(diào)用Invocation
28、Handler的invoke()方法wineHandler決定要如何處置這個請求,可能會轉(zhuǎn)發(fā)給RealSubjectmethod.invoke(sub, args);realRedWineFactory49代理模式設(shè)計模式50代理模式設(shè)計模式Java事務(wù)處理:p Java通過JDBC與數(shù)據(jù)庫進行交互,這是一個如今多數(shù)程序員都不會直接使用的技術(shù),我們更傾向于使用Hibernate和Mybatis,但是,他們在底層都需要JDBC與數(shù)據(jù)庫通信,事務(wù)處理亦是如此;p JDBC提供的事務(wù)處理API非常少,請不要被Spring中事務(wù)處理的那一堆源代碼所打擊得信心盡失,這些框架提供的事務(wù)處理功能歸根結(jié)底主要
29、通過以Connection類的方法完成: Connection.setAutoCommit(boolean); Cmit(); Connection.rollback();51代理模式設(shè)計模式一個轉(zhuǎn)賬的例子:將用戶銀行賬戶(Bank Account)中的存款轉(zhuǎn)帳到該用戶的保險賬戶(Insurance Account)中,兩個賬戶對應(yīng)有不同的數(shù)據(jù)庫表。 有一個BankService用于轉(zhuǎn)賬的業(yè)務(wù)操作 BankService需要兩個DAO類協(xié)同起來工作,一個負(fù)責(zé)銀行賬戶表的操作,另一個負(fù)責(zé)保險賬戶表操作 抽象出一個事務(wù)處理的類TransactionManager專門負(fù)責(zé)事務(wù)處理52代理模式設(shè)計模式
30、53代理模式設(shè)計模式public class TransactionManager private DataSource dataSource; public TransactionManager(DataSource dataSource) this.dataSource = dataSource; public final void start() throws SQLException Connection connection = getConnection(); connection.setAutoCommit(false); public final void commit() t
31、hrows SQLException Connection connection = getConnection(); mit(); public final void rollback() Connection connection = null; try connection = getConnection(); connection.rollback(); catch (SQLException e) throw new RuntimeException(Couldnt rollback on connection + connection + ., e); public final v
32、oid close() Connection connection = null; try connection = getConnection(); connection.setAutoCommit(true); connection.setReadOnly(false); connection.close(); SingleThreadConnectionHolder.removeConnection(dataSource); catch (SQLException e) throw new RuntimeException(Couldnt close connection + conne
33、ction + ., e); 54代理模式設(shè)計模式public class BankService private TransactionManager transactionManager; private ConnectionHolderBankDao connectionHolderBankDao; private ConnectionHolderInsuranceDao connectionHolderInsuranceDao; public BankService(DataSource dataSource) transactionManager = new TransactionM
34、anager(dataSource); connectionHolderBankDao = new ConnectionHolderBankDao(dataSource); connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource); public void transfer(int fromId, int toId, int amount) try transactionManager.start(); connectionHolderBankDao.withdraw(fromId, amount);
35、 connectionHolderInsuranceDao.deposit(toId, amount); transactionMmit(); catch (Exception e) transactionManager.rollback(); finally transactionManager.close(); 55代理模式設(shè)計模式public class Service2 public void B() try transactionManager.start(); transactionMmit(); catch (Exception e) transactionManager.rol
36、lback(); finally transactionManager.close(); public class Service1 public void A() try transactionManager.start(); transactionMmit(); catch (Exception e) transactionManager.rollback(); finally transactionManager.close(); 55代理模式設(shè)計模式56代理模式設(shè)計模式class TransactionInvocationHandler implements InvocationHan
37、dler private Object proxy; private TransactionManager transactionManager; TransactionInvocationHandler(Object object, TransactionManager transactionManager) xy = object; this.transactionManager = transactionManager; public Object invoke(Object o, Method method, Object objects) throws Throwab
38、le transactionManager.start(); Object result = null; try result = method.invoke(proxy, objects); transactionMmit(); catch (Exception e) transactionManager.rollback(); finally transactionManager.close(); return result; 57代理模式設(shè)計模式public class TransactionEnabledProxyManager private TransactionManager t
39、ransactionManager; public TransactionEnabledProxyManager(TransactionManager transactionManager) this.transactionManager = transactionManager; public Object proxyFor(Object object) return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new TransactionInvo
40、cationHandler(object, transactionManager); 58代理模式設(shè)計模式public class BareBankService private ConnectionHolderBankDao connectionHolderBankDao; private ConnectionHolderInsuranceDao connectionHolderInsuranceDao; public BareBankService(DataSource dataSource) connectionHolderBankDao = new ConnectionHolderBa
41、nkDao(dataSource); connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource); public void transfer(final int fromId, final int toId, final int amount) try connectionHolderBankDao.withdraw(fromId, amount); connectionHolderInsuranceDao.deposit(toId, amount); catch (Exception e) throw
42、 new RuntimeException(); 59代理模式設(shè)計模式public class BankService private TransactionManager transactionManager; private ConnectionHolderBankDao connectionHolderBankDao; private ConnectionHolderInsuranceDao connectionHolderInsuranceDao; public BankService(DataSource dataSource) transactionManager = new Tr
43、ansactionManager(dataSource); connectionHolderBankDao = new ConnectionHolderBankDao(dataSource); connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource); public void transfer(int fromId, int toId, int amount) try transactionManager.start(); connectionHolderBankDao.withdraw(fromId
44、, amount); connectionHolderInsuranceDao.deposit(toId, amount); transactionMmit(); catch (Exception e) transactionManager.rollback(); finally transactionManager.close(); 60代理模式設(shè)計模式TransactionEnabledProxyManager transactionEnabledProxyManager = new TransactionEnabledProxyManager(new TransactionManager
45、(dataSource); BankService bankService = new BareBankService(dataSource); BankService proxyBankService = (BankService) transactionEnabledProxyMxyFor(bankService); int toNonExistId = 3333; proxyBankService.transfer(1111, toNonExistId, 200); 61代理模式設(shè)計模式Service1Service2Service3數(shù)據(jù)庫操作事務(wù)處理62代理模式設(shè)計
46、模式public class Service2 public void B() try transactionManager.start(); transactionMmit(); catch (Exception e) transactionManager.rollback(); finally transactionManager.close(); public class Service1 public void A() try transactionManager.start(); transactionMmit(); catch (Exception e) transactionMa
47、nager.rollback(); finally transactionManager.close(); 63代理模式設(shè)計模式代理模式適用于以下情況:p 遠(yuǎn)程(Remote)代理:為一個位于不同的地址空間的對象提供一個本地 的代理對象,這個不同的地址空間可以是在同一臺主機中,也可是在 另一臺主機中,遠(yuǎn)程代理又叫做大使(Ambassador)。p 虛擬(Virtual)代理:如果需要創(chuàng)建一個資源消耗較大的對象,先創(chuàng)建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創(chuàng)建。p Copy-on-Write代理:它是虛擬代理的一種,把復(fù)制(克?。┎僮餮舆t到只有在客戶端真正需要時才執(zhí)行。一般來
48、說,對象的深克隆是一個開銷較大的操作,Copy-on-Write代理可以讓這個操作延遲,只有對象被用到的時候才被克隆。64代理模式設(shè)計模式p 保護(Protect or Access)代理:控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權(quán)限。p 緩沖(Cache)代理:為某一個目標(biāo)操作的結(jié)果提供臨時的存儲空間,以便多個客戶端可以共享這些結(jié)果。p 防火墻(Firewall)代理:保護目標(biāo)不讓惡意用戶接近。p 同步化(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突。p 智能引用(Smart Reference)代理:當(dāng)一個對象被引用時,提供一些額外的操作,
49、如將此對象被調(diào)用的次數(shù)記錄下來等。65代理模式設(shè)計模式代理模式的優(yōu)點如下:p 代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系 統(tǒng)的耦合度。p 遠(yuǎn)程代理使得客戶端可以訪問在遠(yuǎn)程機器上的對象,遠(yuǎn)程機器 可能具有更好的計算性能與處理速度,可以快速響應(yīng)并處理客戶端請求。p 虛擬代理通過使用一個小對象來代表一個大對象,可以減少系 統(tǒng)資源的消耗,對系統(tǒng)進行優(yōu)化并提高運行速度。p 保護代理可以控制對真實對象的使用權(quán)限。66裝飾模式設(shè)計模式代理模式的缺點如下:p 由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。p 實現(xiàn)代理模式需要額外的工作,有些代理模式的
50、實現(xiàn)非常復(fù)雜。設(shè)計模式Round Four模式對比適配器模式畢業(yè)設(shè)計具體研究方向前期調(diào)研671適配器的特點在于兼容,從代碼上的特點來說,適配類與原有的類具有相同的接口,并且持有新的目標(biāo)對象。裝飾模式2裝飾器模式特點在于增強,他的特點是被裝飾類和所有的裝飾類必須實現(xiàn)同一個接口,而且必須持有被裝飾的對象,可以無限裝飾。代理模式3代理模式的特點在于隔離,隔離調(diào)用類和被調(diào)用類的關(guān)系,通過一個代理類去調(diào)用。68設(shè)計模式模式對比適配器模式與代理模式:p 適配器為它所適配的對象提供了一個不同的接口。相反,代理提供了與它的實體相同的接口。然而,用于訪問保護的代理可能會拒絕執(zhí)行實體會執(zhí)行的操作,因此,它的接口實
51、際上可能只是實體接口的一個子集。裝飾模式與代理模式:p 盡管Decorator的實現(xiàn)部分與代理相似,但Decorator的目的不一樣。Decorator為對象添加一個或多個功能,而代理則控制對對象的訪問。設(shè)計模式23種設(shè)計模式小結(jié)設(shè)計模式創(chuàng)建型模式創(chuàng)建型模式結(jié)構(gòu)型模式結(jié)構(gòu)型模式行為模式行為模式工廠方法模式橋接模式模板方法模式抽象工廠模式適配器模式策略模式單例模式裝飾模式狀態(tài)模式建造者模式組合模式觀察者模式原型模式享元模式備忘錄模式外觀模式中介者模式代理模式命令模式訪問者模式職責(zé)鏈模式迭代器模式解釋器模式設(shè)計模式創(chuàng)建型模式(Creational Pattern)p 創(chuàng)建型模式對類的實例化過程進行
52、了抽象,能夠?qū)④浖K中對象的創(chuàng)建和對象的使用分離。為了使軟件的結(jié)構(gòu)更加清晰,外界對于這些對象只需要知道它們共同的接口,而不清楚其具體的實現(xiàn)細(xì)節(jié),使整個系統(tǒng)的設(shè)計更加符合單一職責(zé)原則。p 創(chuàng)建型模式在創(chuàng)建什么(What),由誰創(chuàng)建(Who),何時創(chuàng)建(When)等方面都為軟件設(shè)計者提供了盡可能大的靈活性。創(chuàng)建型模式隱藏了類的實例的創(chuàng)建細(xì)節(jié),通過隱藏對象如何被創(chuàng)建和組合在一起達到使整個系統(tǒng)獨立的目的。設(shè)計模式設(shè)計模式GOF的描述我的理解Singleton單例模式保證一個類僅有一個實例,并提供一個該實例全局的訪問點控制實體對象的數(shù)量Factory Method工廠方法模式定義一個用于創(chuàng)建對象的接口
53、,讓子類決定實例化那個類。FactoryMethod使得一個類的實例化延遲到子類解決的是“某個對象”的創(chuàng)建工作,由于需求的變化,這個對象常常面臨著劇烈的變化,但是這個對象擁有的接口相對穩(wěn)定。也就是說:枝節(jié)常常發(fā)生變化,但是枝節(jié)與主干的接口相對穩(wěn)定Abstract Factory抽象工廠模式提供一個接口,讓該接口負(fù)責(zé)創(chuàng)建一系列“相關(guān)或者相互依賴的對象”,無需指定他們的具體類解決一個系列的對象變化的問題Builder建造者模式將一個復(fù)雜對象的構(gòu)建與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示建造者模式是一步一步創(chuàng)建一個復(fù)雜的對象Prototype原型模式使用原型實例指定創(chuàng)建對象的種類,然后通過
54、拷貝這些原型來創(chuàng)建新的對象對象復(fù)制 淺復(fù)制 深復(fù)制設(shè)計模式結(jié)構(gòu)型模式(Structural Pattern)p 結(jié)構(gòu)型模式描述如何將類或者對象結(jié)合在一起形成更大的結(jié)構(gòu),就像搭積木,可以通過簡單積木的組合形成復(fù)雜的、功能更為強大的結(jié)構(gòu)。p 結(jié)構(gòu)型模式可以分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式: 類結(jié)構(gòu)型模式關(guān)心類的組合,由多個類可以組合成一個更大的 系統(tǒng),在類結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實現(xiàn)關(guān)系。 對象結(jié)構(gòu)型模式關(guān)心類與對象的組合,通過關(guān)聯(lián)關(guān)系使得在一 個類中定義另一個類的實例對象,然后通過該對象調(diào)用其方法。 根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來替代繼 承關(guān)系,因此大部分結(jié)構(gòu)型模式都是對象結(jié)構(gòu)型模式。設(shè)計模式設(shè)計模式GoF的描述我的理解Adapter適配器模式 將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的類可以一起工作 適配器的特點在于兼容,從代碼上的特點來說,適配類與原有的類具有相同的接口,并且持有新的目標(biāo)對象。Bridge橋接模式 將抽象部分與實現(xiàn)部分分離,使他們可以獨立的變化 當(dāng)某個類型具有兩個或兩個以上的緯度變化,通過關(guān)聯(lián)關(guān)系而不是單純繼承關(guān)系來進行系統(tǒng)的擴展。Composite組合模式 將對象組合成樹形結(jié)構(gòu)以表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 防溺水安全應(yīng)急預(yù)案
- 三人共同創(chuàng)業(yè)店鋪股權(quán)分配合同2025
- 專利實施許可合同備案示范合同
- KTV股東合作合同模板
- 上海市新車買賣合同標(biāo)準(zhǔn)模版
- 產(chǎn)品采購合同質(zhì)量保證協(xié)議書
- 個人與個人借款合同范例
- 個人購房正式合同樣本
- 標(biāo)準(zhǔn)借款合同
- 個人與銀行借款合同典范模板
- 一年級的成長歷程
- 2024年南京鐵道職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 正月十五元宵節(jié)介紹課件
- 病毒性肺炎疾病演示課件
- 中考英語語法填空專項練習(xí)附答案(已排版-可直接打印)
- 口腔醫(yī)學(xué)中的人工智能應(yīng)用培訓(xùn)課件
- 軟星酒店網(wǎng)絡(luò)規(guī)劃與設(shè)計
- 自然辯證法概論(新)課件
- 基層醫(yī)療機構(gòu)基本情況調(diào)查報告
- 六西格瑪(6Sigma)詳解及實際案例分析
- 機械制造技術(shù)-成都工業(yè)學(xué)院中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
評論
0/150
提交評論