『壹』 1. 裝飾器模式解決了軟體設計的什麼問題 有什麼優點 請舉例說明該設計模式的應用場景。
裝飾者模式(Decorator Pattern),是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
使用裝飾者模式的時候需要注意一下幾點內容:
(1)裝飾對象和真實對象有相同的介面。這樣客戶端對象就可以以和真實對象相同的方式和裝飾對象交互。
(2)裝飾對象包含一個真實對象的引用。
(3)裝飾對象接受所有的來自客戶端的請求,它把這些請求轉發給真實的對象。
(4)裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。然而,裝飾者模式,不需要子類可以在應用程序運行時,動態擴展功能,更加方便、靈活。
適用裝飾者模式場合:
1.當我們需要為某個現有的對象,動態的增加一個新的功能或職責時,可以考慮使用裝飾模式。
2.當某個對象的職責經常發生變化或者經常需要動態的增加職責,避免為了適應這樣的變化,而增加繼承子類擴展的方式,因為這種方式會造成子類膨脹的速度過快,難以控制。
推薦你一本設計模式方面的優秀書籍:鄭阿奇 主編的《軟體秘笈-設計模式那點事》。裡面講解很到位,實例通俗易懂,看了收獲很大!
祝你早日學會設計模式!
『貳』 關於java中裝飾者模式的詳解,不理解啊,,誰給解釋解釋。。。
裝飾者模式可以動態地給一個對象增加其他職責。就擴展對象功能來說,裝飾者模式比生成子類更為靈活。(定義)
不給你寫代碼了,寫了估計你也不看。
簡單的給你解釋吧:你只會做一件事情A,我想讓你去做B-A這件事情,不改變你的行為,你肯定不會做的。但是小明會做另一件事情B,所以我就可以讓小明去做B,並且告訴小明做完後 如果遇見你 就讓你做事情A。讓後我們你們兩個放在一塊,讓小明做B,然後事情B-A就可以被做了。同樣我想完成事情C-A,只要找到會做C的小王就可以了。
在這里你就是被裝飾者,小明和小王就是裝飾者。之所以把你叫做裝飾者,可能是因為你做的事情是主要的事情。其實這些都是可以靈活利用的 。
建議你看書 header first 設計模式
如果想看代碼,網路太多了。
如果不明白,可以追問。
『叄』 裝飾者模式:上次去面試,面試官問我知道哪些設計模式,我有說裝飾者模式,他問我java.util包裡面有一個類
裝飾者模式就是動態的給對象添加一些職責。就功能來說裝飾著模式相對與生成子類更加靈活。
當然繼承也能實現該功能,但是面向對象的基本原則之一就是:少用繼承,多用組合。
java.util中set就是,hashset和collection的源碼很容易看出,他們是裝飾者模式的構造。
『肆』 關於如何理解裝飾者模式
對於問題不是很明確 無法正確回答~ 任何關於裝修的知識可以幫你解答
希望可以幫到你
點擊我的ID,可以了解更多關於裝修的知識
『伍』 java問題 想問下 裝飾者模式有什麼實際用途呢能舉個實際應用的例子嗎
裝飾者模式用來擴展對象的功能,給對象添加不同的功能。在io流中,比如 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/text.txt")))); 這種對File類的包裝,由內層到外層擴展輸入流的功能,就是一個典型的裝飾者模式。inputstream是被裝飾對象,然後Fileinputstream、InputStream、BufferedReader都是它的裝飾器,用來擴展它的功能!
『陸』 關於java裝飾者模式的一個小問題。
其實我覺得裝飾者和代理模式很像。這里我覺得就是代理模式。worker幫aworker把事情給做了。不過aworker的功能又不只是worker的功能,它還可以有別的功能,比如又傳來一個bworker給它,它就又擴展了一種功能了。
『柒』 java的裝飾者模式中裝飾類為什麼不直接實現介面
裝飾模式使用被裝飾類的一個子類的實例,把客戶端的調用委派到被裝飾類,裝飾模式的關鍵在於這種擴展是完全透明的。
裝飾模式在Java種使用也很廣泛,比如我們在重新定義按鈕、對話框等時候,實際上已經在使用裝飾模式了。裝飾模式最淺顯的例子是相片-相框的例子。
一、原理圖
其中類的職責如下:
抽象構件角色(Project):給出一個介面,以規范准備接收附加責任的對象
具體構件角色(Employe):定義一個將要接收附加責任的類
裝飾角色(Manager):持有一個構件對象的實例,並定義一個與抽象構件介面一致的介面
具體裝飾角色(ManagerA、ManagerB):負責給構件對象「貼上」附加的責任
二、下面通過一個軟體項目例子來說明裝飾模式的使用
過程是這樣的:
項目經理接到一個項目,項目最終要完成編碼。
項目經理接到項目後,先做些前期的工作(比如需求分析、設計),然後將編碼工作委派給代碼工人,代碼工人幹完後,項目經理做項目的收尾工作。
實現代碼如下:
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 12:51:06
* 項目
*/
publicinterfaceProject {
/**
* 寫代碼
*/
voiddoCoding();
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 12:52:12
* 代碼工人
*/
{
/**
* 編碼
*/
publicvoiddoCoding(){
System.out.println("代碼工人 在編寫代碼,加班編啊編啊,終於編完了!");
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 12:51:26
* 項目經理
*/
{
privateProject project;//實際上存放的是代碼工人對象
publicManager(Project project) {
this.project = project;
}
/**
* 編碼
*/
publicvoiddoCoding() {
//項目經理開始新的工作
startNewWork();
}
/**
* 模板:定義項目經理自己的事情
*/
publicvoidstartNewWork() {
//項目經理在做早期工作
doEarlyWork();
//項目經理很牛,做完需求和設計後,直接將編碼委派給代碼工人干
project.doCoding();
//項目經理在做收尾工作
doEndWork();
}
/**
* 項目經理自己的事情:做早期工作
*/
publicvoiddoEarlyWork() {
}
/**
* 項目經理做收尾工作
*/
publicvoiddoEndWork() {
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 13:45:18
* 具體的項目經理A
*/
{
publicManagerA(Project project) {
super(project);
}
/**
* 項目經理自己的事情:做早期工作
*/
publicvoiddoEarlyWork() {
System.out.println("項目經理A 在做需求分析");
System.out.println("項目經理A 在做架構設計");
System.out.println("項目經理A 在做詳細設計");
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 13:45:27
* 具體的項目經理B
*/
{
publicManagerB(Project project) {
super(project);
}
/**
* 項目經理自己的事情:做早期工作
*/
publicvoiddoEarlyWork() {
System.out.println("項目經理B 在做需求分析");
System.out.println("項目經理B 在做詳細設計");
}
/**
* 項目經理做收尾工作
*/
publicvoiddoEndWork() {
System.out.println("項目經理B 在做收尾工作");
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 13:03:22
* 客戶端測試
*/
publicclassClient {
publicstaticvoidmain(String args[]) {
Project employe =newEmploye();//代碼工人
Project managerA =newManagerA(employe);//項目經理
Project managerB =newManagerB(employe);//項目經理
//以經理的名義將編碼完成,功勞都是經理的,實際編碼的是工人
managerA.doCoding();
managerB.doCoding();
}
}
運行結果:
項目經理A 在做需求分析
項目經理A 在做架構設計
項目經理A 在做詳細設計
代碼工人 在編寫代碼,加班編啊編啊,終於編完了!
項目經理B 在做需求分析
項目經理B 在做詳細設計
代碼工人 在編寫代碼,加班編啊編啊,終於編完了!
項目經理B 在做收尾工作
『捌』 Java 代理模式和裝飾者模式的區別
代理模式與裝飾者模式看起來很像,都實現基礎對象實現的介面,在其自身對象中都保存著對被代理/被裝飾者的對象引用。
先來看看裝飾者模式的定義:動態的將責任附加到被裝飾者對象上,用於擴展對象的功能。比繼承的靈活性大。典型的如Java IO的設計即是裝飾者模式的典型應用。
代理模式模式的定義:對其他對象進行代理,以控制對被代理對象的訪問。Spring的為業務邏輯層方法生成的代理類,主要進行一些事務控制等。
由定義可以看出裝飾的責任是擴展功能 ,而代理主要控制訪問。
具體例子可參看Java IO裝飾/Spring的動態代理/Hibernate的代理等。
『玖』 java的i/o類中有哪些用到了裝飾者模式
裝飾者模式用來擴展對象的功能,給對象添加不同的功能。
在io流中,比如
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/text.txt"))));
這種對File類的包裝,由內層到外層擴展輸入流的功能,就是一個典型的裝飾者模式。inputstream是被裝飾對象,然後Fileinputstream、InputStream、BufferedReader都是它的裝飾器,用來擴展它的功能!
『拾』 Java裝飾者模式,被增強類的方法為什麼可以調用
你main方法是靜態方法, 靜態方法是不能調用非靜態方法。 因為靜態方法是提前載入的。這個時候可能非靜態方法根本就還沒載入。所以,是部允許在靜態方法裡面調用非靜態方法的。 可以在靜態方法中,獲得非靜態方法所在的類的對象實例。 在靜態方法中,用這個實例去調用非靜態方法。 比如: A a = new A(); a.aaaaa();