本文目錄一覽:
- 1、java中裝飾模式,裝飾類和被裝飾類要實現同一個介面,為什麼?怎麼理解呢
- 2、關於java中裝飾者模式的詳解,不理解啊,,誰給解釋解釋。。。
- 3、java裝飾模式和繼承的區別
- 4、java問題 想問下 裝飾者模式有什麼實際用途呢?能舉個實際應用的例子嗎?
- 5、什麼是java裝飾設計模式
- 6、java靜態代理和裝飾模式的區別
java中裝飾模式,裝飾類和被裝飾類要實現同一個介面,為什麼?怎麼理解呢
裝飾者需要和被裝飾者必須是一樣的類型,原因有兩個:其一是裝飾者必須能取代被裝飾者,也就是說裝飾者可以脫離被裝飾者單獨使用。 其二是裝飾者和被裝飾者必須達到類型匹配,這樣他們才能組合在一起,然後共同去描述和修飾某一事物。
裝飾者模式,在java jdk中典型的應用是io流:被裝飾者FileInputStream和裝飾者FilterInputStream都是繼承自InputStream。我把他們的類圖給你黏貼出來:
回答滿意的話給最佳噢~
關於java中裝飾者模式的詳解,不理解啊,,誰給解釋解釋。。。
DataInputStream bis = new DataInputStream(new BufferedInputStream(new FileInputStream(“File”)));
BufferedInputStream bis2 = new BufferedInputStream(new DataInputStream(new FileInputStream(“File”)));
BufferedInputStream添加了緩衝功能,請問,bis還有緩衝功能么?bis現在是DataInputStream類型的,bis2才是BufferedInputStream類型的,這是我學些IO的一個問題,為什麼bis還有緩衝功能?
問題:動態給一個對象添加一些額外的職責
思考:可以修改這個類的源代碼嗎?
回答:可以
思考:那直接修改源代碼就行了
問題:如果不可以修改呢?
思考:如果不可以修改源代碼,那怎麼添加?
回答:有一些類庫可以直接修改編譯後的class文件,但是這裡不考慮
可以直接包含這個類的對象,如果這個類有實現某些介面,剛好某個需要添加額外智能的方法正好是其中一個方法,那就好辦了
Son這個類的paint()方法需要添加一些額外的功能
package decorator;
public class Son implements Work {
public void paint() {
System.out.println(“兒子用鉛筆畫好了一幅畫。”);
}
}
這個類不是實現了Work方法嗎?那就好辦了,新建一個類,繼承Work介面:
package decorator;
public class Mother implements Work {
//被裝飾者
private Work work;
public Mother(Work work) {
this.work = work;
}
private Mother() {}
public void paint() {
//媽媽裝飾者做的職責
System.out.println(“媽媽正在做給畫上顏色前的準備工作。”);
//被裝飾者做的職責
work.paint();
//媽媽裝飾者做的職責
System.out.println(“媽媽給畫上好了顏色。”);
}
}
那個所謂的Work介面:
package decorator;
public interface Work {
public void paint();
}
你不是想讓Son可以的paint方法多做點工作么?那我new出Mother類執行paint方法不就可以了嗎
看代碼就知道,其實這個裝飾器模式並不怎麼好用,每個需要裝飾的類或者需要繼承某個介面,這實在是一個限制
網上找的資料:
裝飾模式(Decorator)
裝飾模式又名包裝(Wrapper)模式。
裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案。
裝飾模式通過創建一個包裝對象,也就是裝飾,來包裹真實的對象。
裝飾模式以對客戶端透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。
裝飾模式可以在不創造更多子類的情況下,將對象的功能加以擴展。
裝飾模式把客戶端的調用委派到被裝飾類。裝飾模式的關鍵在於這種擴展是完全透明的。
裝飾模式的角色
抽象構件角色(Component):給出一個抽象介面,以規範準備接收附加責任的對象。
具體構件角色(Concrete Component):定義將要接收附加責任的類。
裝飾角色(Decorator):持有一個構件(Component)對象的引用,並定義一個與抽象構件介面一致的介面。
具體裝飾角色(Concrete Decorator):負責給構件對象「貼上」附加的責任。
Java IO中的裝飾模式
在IO中,具體構件角色是節點流,裝飾角色是過濾流。
FilterInputStream和FilterOutputStream是裝飾角色,而其他派生自它們的類則是具體裝飾角色。
裝飾模式的特點
裝飾對象和真實對象有相同的介面。這樣客戶端對象就可以以和真實對象相同的方式和裝飾對象交互。
裝飾對象包含一個真實對象的引用(reference)。
裝飾對象接收所有來自客戶端的請求,它把這些請求轉發給真實的對象。
裝飾對象可以在轉發這些請求之前或之後附加一些功能。
這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。
程序實例
public interface Component
{
public void doSomething();
}
這是抽象構件角色,是一個介面。具體構件角色實現這個介面:
public class ConcreteComponent implements Component
{
@Override
public void doSomething()
{
System.out.println(“功能A”);
}
}
裝飾角色:
public class Decorator implements Component
{
private Component component;
public Decorator(Component component)
{
this.component = component;
}
@Override
public void doSomething()
{
component.doSomething();
}
}
其中包含了構件角色的引用,方法調用中利用構件角色的方法。
具體裝飾角色(兩個):
public class ConcreteDecorator1 extends Decorator
{
public ConcreteDecorator1(Component component)
{
super(component);
}
@Override
public void doSomething()
{
super.doSomething();
this.doAnotherThing();
}
private void doAnotherThing()
{
System.out.println(“功能B”);
}
}
public class ConcreteDecorator2 extends Decorator
{
public ConcreteDecorator2(Component component)
{
super(component);
}
@Override
public void doSomething()
{
super.doSomething();
this.doAnotherThing();
}
private void doAnotherThing()
{
System.out.println(“功能C”);
}
}
使用測試:
public class Client
{
public static void main(String[] args)
{
Component component = new ConcreteComponent();
Component component1 = new ConcreteDecorator1(component);
component1.doSomething();
System.out.println(“———–“);
Component component2 = new ConcreteDecorator2(component1);
component2.doSomething();
}
}
輸出:
功能A
功能B
———–
功能A
功能B
功能C
java裝飾模式和繼承的區別
java裝飾模式和繼承的區別如下:
裝飾模式以對客戶透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。裝飾模式可以在不使用創造更多子類的情況下,將對象的功能加以擴展。
java問題 想問下 裝飾者模式有什麼實際用途呢?能舉個實際應用的例子嗎?
裝飾者模式用來擴展對象的功能,給對象添加不同的功能。在io流中,比如 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(“d:/text.txt”)))); 這種對File類的包裝,由內層到外層擴展輸入流的功能,就是一個典型的裝飾者模式。inputstream是被裝飾對象,然後Fileinputstream、InputStream、BufferedReader都是它的裝飾器,用來擴展它的功能!
什麼是java裝飾設計模式
在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
舉例:
public class Test {
// 將內容寫到另一個文件
public void write() {
String string = “測試包裝模式”;
try {
FileWriter fw = new FileWriter(“D:/copyfile.txt”);
// 用到包裝模式,擴展FileWriter的功能
BufferedWriter bW = new BufferedWriter(fw);
bW.write(string);
bW.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Test test = new Test();
test.write();
}
}
執行結果:
java靜態代理和裝飾模式的區別
裝飾模式:以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案;
代理模式:給一個對象提供一個代理對象,並有代理對象來控制對原有對象的引用;
裝飾模式應該為所裝飾的對象增強功能;代理模式對代理的對象施加控制,並不提供對象本身的增強功能
二者的實現機制確實是一樣的,可以看到他們的實例代碼重複是很多的。但就語義上說,這兩者的功能是相反的,模式的一個重要作用是簡化其他程序員對你程序的理解,你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大家就知道是在限制。
原創文章,作者:NRH9W,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/128063.html