久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

本人免費(fèi)整理了Java高級(jí)資料,涵蓋了Java、redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并發(fā)分布式等教程,一共30G,需要自己領(lǐng)取。
傳送門:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q

1. 適配器(Adapter)

Intent

把一個(gè)類接口轉(zhuǎn)換成另一個(gè)用戶需要的接口。

創(chuàng)新互聯(lián)從2013年成立,先為零陵等服務(wù)建站,零陵等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為零陵企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Class Diagram

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

鴨子(Duck)和火雞(Turkey)擁有不同的叫聲,Duck 的叫聲調(diào)用 quack() 方法,而 Turkey 調(diào)用 gobble() 方法。

要求將 Turkey 的 gobble() 方法適配成 Duck 的 quack() 方法,從而讓火雞冒充鴨子!

public?interface?Duck?{
????void?quack();}public?interface?Turkey?{
????void?gobble();}public?class?WildTurkey?implements?Turkey?{
????@Override
????public?void?gobble()?{
????????System.out.println("gobble!");
????}}public?class?TurkeyAdapter?implements?Duck?{
????Turkey?turkey;

????public?TurkeyAdapter(Turkey?turkey)?{
????????this.turkey?=?turkey;
????}

????@Override
????public?void?quack()?{
????????turkey.gobble();
????}}public?class?Client?{
????public?static?void?main(String[]?args)?{
????????Turkey?turkey?=?new?WildTurkey();
????????Duck?duck?=?new?TurkeyAdapter(turkey);
????????duck.quack();
????}}

JDK

  • java.util.Arrays#asList()

  • java.util.Collections#list()

  • java.util.Collections#enumeration()

  • javax.xml.bind.annotation.adapters.XMLAdapter

2. 橋接(Bridge)

Intent

將抽象與實(shí)現(xiàn)分離開來(lái),使它們可以獨(dú)立變化。

Class Diagram

  • Abstraction:定義抽象類的接口

  • Implementor:定義實(shí)現(xiàn)類接口

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

RemoteControl 表示遙控器,指代 Abstraction。

TV 表示電視,指代 Implementor。

橋接模式將遙控器和電視分離開來(lái),從而可以獨(dú)立改變遙控器或者電視的實(shí)現(xiàn)。

public?abstract?class?TV?{
????public?abstract?void?on();

????public?abstract?void?off();

????public?abstract?void?tuneChannel();}public?class?Sony?extends?TV?{
????@Override
????public?void?on()?{
????????System.out.println("Sony.on()");
????}

????@Override
????public?void?off()?{
????????System.out.println("Sony.off()");
????}

????@Override
????public?void?tuneChannel()?{
????????System.out.println("Sony.tuneChannel()");
????}}public?class?RCA?extends?TV?{
????@Override
????public?void?on()?{
????????System.out.println("RCA.on()");
????}

????@Override
????public?void?off()?{
????????System.out.println("RCA.off()");
????}

????@Override
????public?void?tuneChannel()?{
????????System.out.println("RCA.tuneChannel()");
????}}public?abstract?class?RemoteControl?{
????protected?TV?tv;

????public?RemoteControl(TV?tv)?{
????????this.tv?=?tv;
????}

????public?abstract?void?on();

????public?abstract?void?off();

????public?abstract?void?tuneChannel();}public?class?ConcreteRemoteControl1?extends?RemoteControl?{
????public?ConcreteRemoteControl1(TV?tv)?{
????????super(tv);
????}

????@Override
????public?void?on()?{
????????System.out.println("ConcreteRemoteControl1.on()");
????????tv.on();
????}

????@Override
????public?void?off()?{
????????System.out.println("ConcreteRemoteControl1.off()");
????????tv.off();
????}

????@Override
????public?void?tuneChannel()?{
????????System.out.println("ConcreteRemoteControl1.tuneChannel()");
????????tv.tuneChannel();
????}}public?class?ConcreteRemoteControl2?extends?RemoteControl?{
????public?ConcreteRemoteControl2(TV?tv)?{
????????super(tv);
????}

????@Override
????public?void?on()?{
????????System.out.println("ConcreteRemoteControl2.on()");
????????tv.on();
????}

????@Override
????public?void?off()?{
????????System.out.println("ConcreteRemoteControl2.off()");
????????tv.off();
????}

????@Override
????public?void?tuneChannel()?{
????????System.out.println("ConcreteRemoteControl2.tuneChannel()");
????????tv.tuneChannel();
????}}public?class?Client?{
????public?static?void?main(String[]?args)?{
????????RemoteControl?remoteControl1?=?new?ConcreteRemoteControl1(new?RCA());
????????remoteControl1.on();
????????remoteControl1.off();
????????remoteControl1.tuneChannel();
????????RemoteControl?remoteControl2?=?new?ConcreteRemoteControl2(new?Sony());
?????????remoteControl2.on();
?????????remoteControl2.off();
?????????remoteControl2.tuneChannel();
????}}

JDK

  • AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)

  • JDBC

3. 組合(Composite)

Intent

將對(duì)象組合成樹形結(jié)構(gòu)來(lái)表示“整體/部分”層次關(guān)系,允許用戶以相同的方式處理單獨(dú)對(duì)象和組合對(duì)象。

Class Diagram

組件(Component)類是組合類(Composite)和葉子類(Leaf)的父類,可以把組合類看成是樹的中間節(jié)點(diǎn)。

組合對(duì)象擁有一個(gè)或者多個(gè)組件對(duì)象,因此組合對(duì)象的操作可以委托給組件對(duì)象去處理,而組件對(duì)象可以是另一個(gè)組合對(duì)象或者葉子對(duì)象。

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

public?abstract?class?Component?{
????protected?String?name;

????public?Component(String?name)?{
????????this.name?=?name;
????}

????public?void?print()?{
????????print(0);
????}

????abstract?void?print(int?level);

????abstract?public?void?add(Component?component);

????abstract?public?void?remove(Component?component);}public?class?Composite?extends?Component?{

????private?List<Component>?child;

????public?Composite(String?name)?{
????????super(name);
????????child?=?new?ArrayList<>();
????}

????@Override
????void?print(int?level)?{
????????for?(int?i?=?0;?i?<?level;?i++)?{
????????????System.out.print("--");
????????}
????????System.out.println("Composite:"?+?name);
????????for?(Component?component?:?child)?{
????????????component.print(level?+?1);
????????}
????}

????@Override
????public?void?add(Component?component)?{
????????child.add(component);
????}

????@Override
????public?void?remove(Component?component)?{
????????child.remove(component);
????}}public?class?Leaf?extends?Component?{
????public?Leaf(String?name)?{
????????super(name);
????}

????@Override
????void?print(int?level)?{
????????for?(int?i?=?0;?i?<?level;?i++)?{
????????????System.out.print("--");
????????}
????????System.out.println("left:"?+?name);
????}

????@Override
????public?void?add(Component?component)?{
????????throw?new?UnsupportedOperationException();?//?犧牲透明性換取單一職責(zé)原則,這樣就不用考慮是葉子節(jié)點(diǎn)還是組合節(jié)點(diǎn)????}

????@Override
????public?void?remove(Component?component)?{
????????throw?new?UnsupportedOperationException();
????}}public?class?Client?{
????public?static?void?main(String[]?args)?{
????????Composite?root?=?new?Composite("root");
????????Component?node1?=?new?Leaf("1");
????????Component?node2?=?new?Composite("2");
????????Component?node3?=?new?Leaf("3");
????????root.add(node1);
????????root.add(node2);
????????root.add(node3);
????????Component?node21?=?new?Leaf("21");
????????Component?node22?=?new?Composite("22");
????????node2.add(node21);
????????node2.add(node22);
????????Component?node221?=?new?Leaf("221");
????????node22.add(node221);
????????root.print();
????}}Composite:root--left:1--Composite:2----left:21----Composite:22------left:221--left:3

JDK

  • javax.swing.JComponent#add(Component)

  • java.awt.Container#add(Component)

  • java.util.Map#putAll(Map)

  • java.util.List#addAll(Collection)

  • java.util.Set#addAll(Collection)

4. 裝飾(Decorator)

Intent

為對(duì)象動(dòng)態(tài)添加功能。

Class Diagram

裝飾者(Decorator)和具體組件(ConcreteComponent)都繼承自組件(Component),具體組件的方法實(shí)現(xiàn)不需要依賴于其它對(duì)象,而裝飾者組合了一個(gè)組件,這樣它可以裝飾其它裝飾者或者具體組件。所謂裝飾,就是把這個(gè)裝飾者套在被裝飾者之上,從而動(dòng)態(tài)擴(kuò)展被裝飾者的功能。裝飾者的方法有一部分是自己的,這屬于它的功能,然后調(diào)用被裝飾者的方法實(shí)現(xiàn),從而也保留了被裝飾者的功能。可以看到,具體組件應(yīng)當(dāng)是裝飾層次的最低層,因?yàn)橹挥芯唧w組件的方法實(shí)現(xiàn)不需要依賴于其它對(duì)象。

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

設(shè)計(jì)不同種類的飲料,飲料可以添加配料,比如可以添加牛奶,并且支持動(dòng)態(tài)添加新配料。每增加一種配料,該飲料的價(jià)格就會(huì)增加,要求計(jì)算一種飲料的價(jià)格。

下圖表示在 DarkRoast 飲料上新增新添加 Mocha 配料,之后又添加了 Whip 配料。DarkRoast 被 Mocha 包裹,Mocha 又被 Whip 包裹。它們都繼承自相同父類,都有 cost() 方法,外層類的 cost() 方法調(diào)用了內(nèi)層類的 cost() 方法。

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

public?interface?Beverage?{
????double?cost();}public?class?DarkRoast?implements?Beverage?{
????@Override
????public?double?cost()?{
????????return?1;
????}}public?class?HouseBlend?implements?Beverage?{
????@Override
????public?double?cost()?{
????????return?1;
????}}public?abstract?class?CondimentDecorator?implements?Beverage?{
????protected?Beverage?beverage;}public?class?Milk?extends?CondimentDecorator?{

????public?Milk(Beverage?beverage)?{
????????this.beverage?=?beverage;
????}

????@Override
????public?double?cost()?{
????????return?1?+?beverage.cost();
????}}public?class?Mocha?extends?CondimentDecorator?{

????public?Mocha(Beverage?beverage)?{
????????this.beverage?=?beverage;
????}

????@Override
????public?double?cost()?{
????????return?1?+?beverage.cost();
????}}public?class?Client?{

????public?static?void?main(String[]?args)?{
????????Beverage?beverage?=?new?HouseBlend();
????????beverage?=?new?Mocha(beverage);
????????beverage?=?new?Milk(beverage);
????????System.out.println(beverage.cost());
????}}3.0

設(shè)計(jì)原則

類應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉:也就是添加新功能時(shí)不需要修改代碼。飲料可以動(dòng)態(tài)添加新的配料,而不需要去修改飲料的代碼。

不可能把所有的類設(shè)計(jì)成都滿足這一原則,應(yīng)當(dāng)把該原則應(yīng)用于最有可能發(fā)生改變的地方。

JDK

  • java.io.BufferedInputStream(InputStream)

  • java.io.DataInputStream(InputStream)

  • java.io.BufferedOutputStream(OutputStream)

  • java.util.zip.ZipOutputStream(OutputStream)

  • java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap

5. 外觀(Facade)

Intent

提供了一個(gè)統(tǒng)一的接口,用來(lái)訪問(wèn)子系統(tǒng)中的一群接口,從而讓子系統(tǒng)更容易使用。

Class Diagram

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

觀看電影需要操作很多電器,使用外觀模式實(shí)現(xiàn)一鍵看電影功能。

public?class?SubSystem?{
????public?void?turnOnTV()?{
????????System.out.println("turnOnTV()");
????}

????public?void?setCD(String?cd)?{
????????System.out.println("setCD(?"?+?cd?+?"?)");
????}

????public?void?startWatching(){
????????System.out.println("startWatching()");
????}}public?class?Facade?{
????private?SubSystem?subSystem?=?new?SubSystem();

????public?void?watchMovie()?{
????????subSystem.turnOnTV();
????????subSystem.setCD("a?movie");
????????subSystem.startWatching();
????}}public?class?Client?{
????public?static?void?main(String[]?args)?{
????????Facade?facade?=?new?Facade();
????????facade.watchMovie();
????}}

設(shè)計(jì)原則

最少知識(shí)原則:只和你的密友談話。也就是說(shuō)客戶對(duì)象所需要交互的對(duì)象應(yīng)當(dāng)盡可能少。

6. 享元(Flyweight)

Intent

利用共享的方式來(lái)支持大量細(xì)粒度的對(duì)象,這些對(duì)象一部分內(nèi)部狀態(tài)是相同的。

Class Diagram

  • Flyweight:享元對(duì)象

  • IntrinsicState:內(nèi)部狀態(tài),享元對(duì)象共享內(nèi)部狀態(tài)

  • ExtrinsicState:外部狀態(tài),每個(gè)享元對(duì)象的外部狀態(tài)不同

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

public?interface?Flyweight?{
????void?doOperation(String?extrinsicState);}public?class?ConcreteFlyweight?implements?Flyweight?{

????private?String?intrinsicState;

????public?ConcreteFlyweight(String?intrinsicState)?{
????????this.intrinsicState?=?intrinsicState;
????}

????@Override
????public?void?doOperation(String?extrinsicState)?{
????????System.out.println("Object?address:?"?+?System.identityHashCode(this));
????????System.out.println("IntrinsicState:?"?+?intrinsicState);
????????System.out.println("ExtrinsicState:?"?+?extrinsicState);
????}}public?class?FlyweightFactory?{

????private?HashMap<String,?Flyweight>?flyweights?=?new?HashMap<>();

????Flyweight?getFlyweight(String?intrinsicState)?{
????????if?(!flyweights.containsKey(intrinsicState))?{
????????????Flyweight?flyweight?=?new?ConcreteFlyweight(intrinsicState);
????????????flyweights.put(intrinsicState,?flyweight);
????????}
????????return?flyweights.get(intrinsicState);
????}}public?class?Client?{

????public?static?void?main(String[]?args)?{
????????FlyweightFactory?factory?=?new?FlyweightFactory();
????????Flyweight?flyweight1?=?factory.getFlyweight("aa");
????????Flyweight?flyweight2?=?factory.getFlyweight("aa");
????????flyweight1.doOperation("x");
????????flyweight2.doOperation("y");
????}}Object?address:?1163157884IntrinsicState:?aaExtrinsicState:?xObject?address:?1163157884IntrinsicState:?aaExtrinsicState:?y

JDK

Java 利用緩存來(lái)加速大量小對(duì)象的訪問(wèn)時(shí)間。

  • java.lang.Integer#valueOf(int)

  • java.lang.Boolean#valueOf(boolean)

  • java.lang.Byte#valueOf(byte)

  • java.lang.Character#valueOf(char)

7. 代理(Proxy)

Intent

控制對(duì)其它對(duì)象的訪問(wèn)。

Class Diagram

代理有以下四類:

  • 遠(yuǎn)程代理(Remote Proxy):控制對(duì)遠(yuǎn)程對(duì)象(不同地址空間)的訪問(wèn),它負(fù)責(zé)將請(qǐng)求及其參數(shù)進(jìn)行編碼,并向不同地址空間中的對(duì)象發(fā)送已經(jīng)編碼的請(qǐng)求。

  • 虛擬代理(Virtual Proxy):根據(jù)需要?jiǎng)?chuàng)建開銷很大的對(duì)象,它可以緩存實(shí)體的附加信息,以便延遲對(duì)它的訪問(wèn),例如在網(wǎng)站加載一個(gè)很大圖片時(shí),不能馬上完成,可以用虛擬代理緩存圖片的大小信息,然后生成一張臨時(shí)圖片代替原始圖片。

  • 保護(hù)代理(Protection Proxy):按權(quán)限控制對(duì)象的訪問(wèn),它負(fù)責(zé)檢查調(diào)用者是否具有實(shí)現(xiàn)一個(gè)請(qǐng)求所必須的訪問(wèn)權(quán)限。

  • 智能代理(Smart Reference):取代了簡(jiǎn)單的指針,它在訪問(wèn)對(duì)象時(shí)執(zhí)行一些附加操作:記錄對(duì)象的引用次數(shù);當(dāng)?shù)谝淮我靡粋€(gè)對(duì)象時(shí),將它裝入內(nèi)存;在訪問(wèn)一個(gè)實(shí)際對(duì)象前,檢查是否已經(jīng)鎖定了它,以確保其它對(duì)象不能改變它。

Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)

Implementation

以下是一個(gè)虛擬代理的實(shí)現(xiàn),模擬了圖片延遲加載的情況下使用與圖片大小相等的臨時(shí)內(nèi)容去替換原始圖片,直到圖片加載完成才將圖片顯示出來(lái)。

public?interface?Image?{
????void?showImage();}public?class?HighResolutionImage?implements?Image?{

????private?URL?imageURL;
????private?long?startTime;
????private?int?height;
????private?int?width;

????public?int?getHeight()?{
????????return?height;
????}

????public?int?getWidth()?{
????????return?width;
????}

????public?HighResolutionImage(URL?imageURL)?{
????????this.imageURL?=?imageURL;
????????this.startTime?=?System.currentTimeMillis();
????????this.width?=?600;
????????this.height?=?600;
????}

????public?boolean?isLoad()?{
????????//?模擬圖片加載,延遲?3s?加載完成????????long?endTime?=?System.currentTimeMillis();
????????return?endTime?-?startTime?>?3000;
????}

????@Override
????public?void?showImage()?{
????????System.out.println("Real?Image:?"?+?imageURL);
????}}public?class?ImageProxy?implements?Image?{

????private?HighResolutionImage?highResolutionImage;

????public?ImageProxy(HighResolutionImage?highResolutionImage)?{
????????this.highResolutionImage?=?highResolutionImage;
????}

????@Override
????public?void?showImage()?{
????????while?(!highResolutionImage.isLoad())?{
????????????try?{
????????????????System.out.println("Temp?Image:?"?+?highResolutionImage.getWidth()?+?"?"?+?highResolutionImage.getHeight());
????????????????Thread.sleep(100);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????????highResolutionImage.showImage();
????}}public?class?ImageViewer?{

????public?static?void?main(String[]?args)?throws?Exception?{
????????String?image?=?"http://image.jpg";
????????URL?url?=?new?URL(image);
????????HighResolutionImage?highResolutionImage?=?new?HighResolutionImage(url);
????????ImageProxy?imageProxy?=?new?ImageProxy(highResolutionImage);
????????imageProxy.showImage();
????}}

JDK

  • java.lang.reflect.Proxy

  • RMI

網(wǎng)站名稱:Java的23種設(shè)計(jì)模式,詳細(xì)講解(三)
文章轉(zhuǎn)載:http://sd-ha.com/article46/ghdieg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)標(biāo)簽優(yōu)化、營(yíng)銷型網(wǎng)站建設(shè)服務(wù)器托管、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)