犀牛云 做網(wǎng)站百度指數(shù)資訊指數(shù)是指什么
目錄
適配器模式
簡介
角色
使用
優(yōu)缺點(diǎn)
使用場景
裝飾器模式
簡介
優(yōu)缺點(diǎn)
模式結(jié)構(gòu)
使用
使用場景
適配器模式
簡介
允許將不兼容的對象包裝成一個(gè)適配器類,使得其他類可以通過適配器類與原始對象進(jìn)行交互,從而提高兼容性
角色
目標(biāo)角色:該角色定義把其他類轉(zhuǎn)換為何種接口,也就是我們的期望接口
源角色:你想把誰轉(zhuǎn)換成目標(biāo)角色,這個(gè)“誰”就是源角色,它是已經(jīng)存在的、運(yùn)行良好的類或?qū)ο?/p>
適配器角色:適配器模式的核心角色,其他兩個(gè)角色都是已經(jīng)存在的角色,而適配器角色是需要新建立的,它的職責(zé)非常簡單:通過繼承或是類關(guān)聯(lián)的方式把源角色轉(zhuǎn)換為目標(biāo)角色
使用
1.定義目標(biāo)接口:創(chuàng)建一個(gè)目標(biāo)接口,這個(gè)接口定義了客戶端所期望的功能。
2.創(chuàng)建原始類:客戶端原始功能
3.創(chuàng)建適配器類:創(chuàng)建一個(gè)適配器類,該類實(shí)現(xiàn)了目標(biāo)接口,同時(shí)包裝了不兼容的原始對象,使得客戶端可以通過目標(biāo)接口與原始對象進(jìn)行交互
4.使用目標(biāo)接口:客戶端代碼使用目標(biāo)接口與適配器進(jìn)行交互
// 目標(biāo)接口
interface Target { void request();
} // 原始類
class Adaptee { void specificRequest() { System.out.println("Adaptee's specific request."); }
} // 適配器類
class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); }
} // 客戶端代碼
public class Client { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target target = new Adapter(adaptee); target.request(); }
}
????????目標(biāo)接口Target
,它定義了一個(gè)request
方法。我們還有一個(gè)原始類Adaptee
,它有一個(gè)名為specificRequest
的方法。我們的適配器類Adapter
實(shí)現(xiàn)了目標(biāo)接口,并且包裝了原始類的specificRequest
方法。在客戶端代碼中,我們創(chuàng)建了一個(gè)原始類的實(shí)例和一個(gè)適配器類的實(shí)例,然后將適配器類的實(shí)例傳遞給目標(biāo)接口的引用。當(dāng)我們調(diào)用目標(biāo)接口的request
方法時(shí),實(shí)際上是適配器類在調(diào)用原始類的specificRequest
方法
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
??????? 1.能提高類的透明性和復(fù)用,現(xiàn)有的類復(fù)用但不需要改變。
??????? 2.目標(biāo)類和適配器類解耦,提高程序的擴(kuò)展性。
??????? 3.在很多業(yè)務(wù)場景中符合開閉原則
缺點(diǎn):
??????? 1.適配器編寫過程需要全面考慮,可能會增加系統(tǒng)的復(fù)雜性
??????? 2.增加代碼閱讀難度,降低代碼可讀性,過多使用適配器會使系統(tǒng)代碼變得凌亂
使用場景
??????? 1.一個(gè)類的接口轉(zhuǎn)換成期望的另一個(gè)接口,使不能兼容的兩個(gè)類一起工作
??????? 2.想要?jiǎng)?chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類協(xié)同工作
??????? 3.在軟件維護(hù)期間,由于不同產(chǎn)品或不同廠家造成功能類似而接口不相同的情況,可以通過適配器模式來解決
????????使用適配器模式可以降低不同組件之間的耦合度,提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。同時(shí),適配器模式還可以解決不同系統(tǒng)之間的接口不兼容問題
裝飾器模式
簡介
??????? 在不改變現(xiàn)有對象結(jié)構(gòu)下,動態(tài)的給對象添加一些功能
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
??????? 1.裝飾器是繼承的有力補(bǔ)充,比繼承靈活,在不改變原有對象的情況下,動態(tài)的給一個(gè)對象擴(kuò)展功能,即插即用
??????? 2.通過使用不用裝飾類及這些裝飾類的排列組合,可以實(shí)現(xiàn)不同效果
??????? 3.裝飾器模式完全遵守開閉原則
缺點(diǎn)
????????裝飾器模式會增加許多子類,過度使用會增加程序得復(fù)雜性
模式結(jié)構(gòu)
角色:
????????抽象構(gòu)件角色:定義一個(gè)抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對象
????????具體構(gòu)件角色:實(shí)現(xiàn)抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)
????????抽象裝飾角色:繼承抽象構(gòu)件,并包含具體構(gòu)件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能
????????具體裝飾角色:實(shí)現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對象添加附加的責(zé)任
結(jié)構(gòu)圖:
使用
1.創(chuàng)建接口
public interface Shape { double getArea();
}
2.接口具體實(shí)現(xiàn)類
public class Rectangle implements Shape { private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } @Override public double getArea() { return length * width; }
}
3.創(chuàng)建抽象裝飾器
public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape shape) { this.decoratedShape = shape; } @Override public double getArea() { return decoratedShape.getArea(); }
}
4.創(chuàng)建具體裝飾器
public class RectangleWithBorder extends ShapeDecorator { private double borderWidth; public RectangleWithBorder(Shape shape, double borderWidth) { super(shape); this.borderWidth = borderWidth; } @Override public double getArea() { return decoratedShape.getArea() + borderWidth * decoratedShape.getArea(); }
}
5.使用
public class Main { public static void main(String[] args) { Shape rectangle = new Rectangle(5, 5); Shape rectangleWithBorder = new RectangleWithBorder(rectangle, 1); // 給矩形添加邊框?qū)挾葹?的裝飾器 System.out.println("Rectangle area: " + rectangle.getArea()); // 輸出:Rectangle area: 25.0 System.out.println("Rectangle with border area: " + rectangleWithBorder.getArea()); // 輸出:Rectangle with border area: 27.0 }
}
使用場景
1.擴(kuò)展功能:當(dāng)您想要擴(kuò)展一個(gè)類的功能時(shí),可以使用裝飾器模式來添加新的責(zé)任,而不需要修改原有類的代碼。這使得代碼更加靈活,易于維護(hù)
2.動態(tài)變化:如果需要在運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)地改變對象的行為,可以使用裝飾器模式
3.統(tǒng)一接口:如果有一組具有相似功能但是又不完全相同的類,可以使用裝飾器模式來統(tǒng)一它們的接口,使得在使用它們時(shí)不需要關(guān)心具體的類
4.延遲加載:如果某些數(shù)據(jù)是可選的,可以在需要時(shí)才加載,使用裝飾器模式可以實(shí)現(xiàn)延遲加載的功能
5.處理復(fù)雜對象:當(dāng)涉及到復(fù)雜的對象結(jié)構(gòu)時(shí),裝飾器模式可以簡化代碼。通過將不同的行為封裝到不同的裝飾器中,可以組合這些裝飾器來創(chuàng)建具有不同行為的對象
????????裝飾器模式適用于在不修改原有代碼的基礎(chǔ)上,動態(tài)地給對象添加新的行為。它適用于需要在運(yùn)行時(shí)動態(tài)地改變對象行為或者需要統(tǒng)一接口的場景。