佳木斯城鄉(xiāng)建設(shè)局官方網(wǎng)站seo排名專業(yè)公司
?1.裝飾者模式
裝飾者模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。
使用場(chǎng)景:
-
在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
-
需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,這些功能也可以動(dòng)態(tài)地被撤銷。?當(dāng)不能采用繼承的方式對(duì)系統(tǒng)進(jìn)行擴(kuò)充或者采用繼承不利于系統(tǒng)擴(kuò)展和維護(hù)時(shí)。
這種模式創(chuàng)建了一個(gè)裝飾類,用來(lái)包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
示例:
interface Coffee {double getCost();String getIngredients();
}class SimpleCoffee implements Coffee {@Overridepublic double getCost() {return 1;}@Overridepublic String getIngredients() {return "Coffee";}
}abstract class CoffeeDecorator implements Coffee {private final Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic double getCost() {return decoratedCoffee.getCost();}@Overridepublic String getIngredients() {return decoratedCoffee.getIngredients();}
}class MilkCoffee extends CoffeeDecorator {public MilkCoffee(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.5;}@Overridepublic String getIngredients() {return super.getIngredients() + ", Milk";}
}class WhipCoffee extends CoffeeDecorator {public WhipCoffee(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.7;}@Overridepublic String getIngredients() {return super.getIngredients() + ", Whip";}
}public class DecoratorExample {public static void main(String[] args) {Coffee c = new SimpleCoffee();System.out.println("Cost : " + c.getCost() + "; Ingredients : " + c.getIngredients());c = new MilkCoffee(c);System.out.println("Cost : " + c.getCost() + "; Ingredients : " + c.getIngredients());c = new WhipCoffee(c);System.out.println("Cost : " + c.getCost() + "; Ingredients : " + c.getIngredients());}
}
該示例演示了一個(gè)簡(jiǎn)單的咖啡飲料店,其中定義了一個(gè)抽象接口Coffee,該接口有兩個(gè)方法:getCost()和getIngredients()。
然后我們定義了一個(gè)簡(jiǎn)單的咖啡飲料:SimpleCoffee,它實(shí)現(xiàn)了Coffee接口,并且有默認(rèn)的價(jià)格和成分。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
-
裝飾者模式可以提供比繼承更多的靈活性
-
可以通過(guò)一種動(dòng)態(tài)的方式來(lái)擴(kuò)展一個(gè)對(duì)象的功能,在運(yùn)行時(shí)選擇不同的裝飾器,從而實(shí)現(xiàn)不同的行為。
-
通過(guò)使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合??梢允褂枚鄠€(gè)具體裝飾類來(lái)裝飾同一對(duì)象,得到功能更為強(qiáng)大的對(duì)象。
-
具體構(gòu)件類與具體裝飾類可以獨(dú)立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時(shí)再對(duì)其進(jìn)行組合,原有代碼無(wú)須改變,符合“開(kāi)閉原則”。
缺點(diǎn)
-
會(huì)產(chǎn)生很多的小對(duì)象,增加了系統(tǒng)的復(fù)雜性
-
這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著裝飾模式比繼承更加易于出錯(cuò),排錯(cuò)也很困難,對(duì)于多次裝飾的對(duì)象,調(diào)試時(shí)尋找錯(cuò)誤可能需要逐級(jí)排查,較為煩瑣。
2.策略模式
策略模式(Strategy Pattern)是一種常見(jiàn)的設(shè)計(jì)模式,它定義了一族算法,將每個(gè)算法都封裝起來(lái),讓它們之間可以互相替換。策略模式可以使得算法獨(dú)立于使用它的客戶端而獨(dú)立變化,從而可以讓客戶端在不修改源代碼的情況下改變算法的使用方式。
這里是一個(gè)使用策略模式實(shí)現(xiàn)排序的示例代碼。假設(shè)有一個(gè)Sorter類,它可以使用不同的排序算法來(lái)對(duì)一個(gè)整數(shù)數(shù)組進(jìn)行排序,其中具體使用哪個(gè)算法由客戶端代碼指定。
首先,需要定義一個(gè)接口SortStrategy,表示一個(gè)排序算法。這個(gè)接口包含一個(gè)排序方法sort,它接受一個(gè)整數(shù)數(shù)組作為參數(shù),并返回排序后的數(shù)組:
public interface SortStrategy {int[] sort(int[] array);
}
接下來(lái),可以定義具體的排序算法。這里,我們實(shí)現(xiàn)了兩種排序算法:冒泡排序和快速排序。它們都實(shí)現(xiàn)了SortStrategy接口:
public class BubbleSort implements SortStrategy {public int[] sort(int[] array) {// 冒泡排序算法的具體實(shí)現(xiàn)// ...return sortedArray;}
}public class QuickSort implements SortStrategy {public int[] sort(int[] array) {// 快速排序算法的具體實(shí)現(xiàn)// ...return sortedArray;}
}
現(xiàn)在,我們可以定義Sorter類了。它包含一個(gè)sort方法,它接受一個(gè)整數(shù)數(shù)組和一個(gè)排序策略作為參數(shù)。排序策略是一個(gè)實(shí)現(xiàn)了SortStrategy接口的類的實(shí)例。Sorter類的sort方法使用傳入的排序策略來(lái)對(duì)數(shù)組進(jìn)行排序
public class Sorter {private SortStrategy strategy;public void setStrategy(SortStrategy strategy) {this.strategy = strategy;}public int[] sort(int[] array) {return this.strategy.sort(array);}
}
最后,可以在客戶端代碼中使用Sorter類來(lái)對(duì)數(shù)組進(jìn)行排序了。先創(chuàng)建一個(gè)整數(shù)數(shù)組,然后創(chuàng)建一個(gè)Sorter對(duì)象,并將排序策略設(shè)置為冒泡排序。然后,使用Sorter對(duì)象的sort方法對(duì)數(shù)組進(jìn)行排序,并將結(jié)果打印出來(lái)。接著,將排序策略設(shè)置為快速排序,再次對(duì)數(shù)組進(jìn)行排序,并將結(jié)果打印出來(lái)
public static void main(String[] args) {int[] array = {5, 2, 4, 6, 1, 3};Sorter sorter = new Sorter();sorter.setStrategy(new BubbleSort());int[] sortedArray = sorter.sort(array);System.out.println(Arrays.toString(sortedArray)); // 輸出 [1, 2, 3, 4, 5, 6]sorter.setStrategy(new QuickSort());sortedArray = sorter.sort(array);System.out.println(Arrays.toString(sortedArray)); // 輸出 [1, 2, 3, 4, 5, 6]
}
策略模式是一種行為型設(shè)計(jì)模式,它可以動(dòng)態(tài)地更改一個(gè)類的行為。
在這個(gè)代碼中,我們有兩種排序算法:BubbleSort 和 QuickSort。
在 Sorter 類中,我們使用策略模式,以便動(dòng)態(tài)地選擇要使用的排序算法。
在主類 Main 中,我們創(chuàng)建了一個(gè) Sorter 對(duì)象,并使用 BubbleSort 算法排序。
然后,我們可以通過(guò)使用 setSortStrategy() 方法更改要使用的排序算法。
其實(shí)策略模式和模板模式很相似,但又不相同,我們看下一章:詳述java的設(shè)計(jì)模式(三)