日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
這是我見(jiàn)過(guò)最通俗易懂的裝飾者模式講解了!

1.什么是裝飾者模式

動(dòng)態(tài)給對(duì)象增加功能,從一個(gè)對(duì)象的外部來(lái)給對(duì)象添加功能,相當(dāng)于改變了對(duì)象的外觀,比用繼承的方式更加的靈活。

當(dāng)使用裝飾后,從外部系統(tǒng)的角度看,就不再是原來(lái)的那個(gè)對(duì)象了,而是使用一系列的裝飾器裝飾過(guò)后的對(duì)象。

2.結(jié)構(gòu)

角色:

  •  Component:組件對(duì)象的抽象接口,可以給這些對(duì)象動(dòng)態(tài)的增加職責(zé)/功能。
  •  ConcreteComponent:具體的組件的對(duì)象,實(shí)現(xiàn)組件對(duì)象的接口,是被裝飾器裝飾的原始對(duì)象,即可以給這個(gè)對(duì)象動(dòng)態(tài)的添加職責(zé)。
  •  Decorator:所有裝飾器的抽象父類(lèi),實(shí)現(xiàn)了組件對(duì)象的接口,并且持有一個(gè)組件對(duì)象(被裝飾的對(duì)象)。
  •  ConcreteDecorator:具體的裝飾器,具體實(shí)現(xiàn)向裝飾對(duì)象添加功能。

3.示例

下面我們用裝飾者模式實(shí)現(xiàn)如下的功能:更多:設(shè)計(jì)模式聚合

要求用戶(hù)輸入一段文字,比如 Hello Me,然后屏幕輸出幾個(gè)選項(xiàng)

  •  加密
  •  反轉(zhuǎn)字符串
  •  轉(zhuǎn)成大寫(xiě)
  •  轉(zhuǎn)成小寫(xiě)
  •  擴(kuò)展或者剪裁到10個(gè)字符,不足部分用!補(bǔ)充
  •  用戶(hù)輸入 任意組合,比如 1,3 表示先執(zhí)行1的邏輯,再執(zhí)行3的邏輯
  •  根據(jù)用戶(hù)輸入的選擇,進(jìn)行處理后,輸出結(jié)果 
 
 
 
 
  1. //組件對(duì)象的接口  
  2. public interface ICompoment {  
  3.      String display(String str);  
  4. }  
 
 
 
 
  1. //具體的組件對(duì)象  
  2. public class DetailCompoment implements ICompoment {  
  3.     @Override  
  4.     public String display(String str) {  
  5.         System.out.println("原來(lái)內(nèi)容:"+str);  
  6.         return str;  
  7.     }  
  8. }  
 
 
 
 
  1. //所有裝飾器的父類(lèi),實(shí)現(xiàn)了組件接口  
  2. public abstract class Decorator implements ICompoment{  
  3.       //持有了一個(gè)組件對(duì)象  
  4.       protected ICompoment compoment;  
  5.       public Decorator(ICompoment compoment) {  
  6.             this.compoment = compoment;  
  7.       }  
  8.       @Override  
  9.       public String display(String str) {  
  10.             return compoment.display(str);  
  11.       }  
  12.       //對(duì)組件對(duì)象進(jìn)行裝飾的抽象方法  
  13.       public abstract String transform(String str);  
  14. }  
 
 
 
 
  1. //加密、解密工具類(lèi)  
  2. public class EnDecodeUtil {  
  3.     private static final char password='a';  
  4.     public static String encodeDecode(String str){  
  5.         char[] chars = str.toCharArray();  
  6.         for (int i = 0; i < chars.length; i++) {  
  7.             chars[i] = (char) (chars[i] ^ password);  
  8.         }  
  9.         return new String(chars);  
  10.     }  
  11. }  
 
 
 
 
  1. //加密裝飾器  
  2. public class EncodeDecorator extends Decorator {  
  3.     public EncodeDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         return transform(display);  
  10.     }  
  11.     @Override  
  12.     public String transform(String str) {  
  13.         System.out.println("invoke EncodeDecorator....");  
  14.        return EnDecodeUtil.encodeDecode(str);  
  15.     }  
  16. }  
 
 
 
 
  1. //解密裝飾器  
  2. public class DecodeDecorator extends Decorator {  
  3.     public DecodeDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         return transform(display);  
  10.     }  
  11.     @Override  
  12.     public String transform(String str) {  
  13.         System.out.println("invoke DecodeDecorator...");  
  14.         return EnDecodeUtil.encodeDecode(str);  
  15.     }  
  16. }  
 
 
 
 
  1. //反轉(zhuǎn) 裝飾器  
  2. public class ReverseDecorator extends Decorator {  
  3.     public ReverseDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         String transformtransform = transform(display);  
  10.         return transform;  
  11.     } 
  12.     @Override  
  13.     public String transform(String str) {  
  14.         System.out.println("invoke ReverseDecorator....");  
  15.         StringBuilder sb = new StringBuilder(str);  
  16.         return sb.reverse().toString();  
  17.     }  
  18. }  
 
 
 
 
  1. //轉(zhuǎn)為大寫(xiě)的裝飾器  
  2. public class UpperDecorator extends Decorator {  
  3.     public UpperDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         String transformtransform = transform(display);  
  10.         return transform;  
  11.     }  
  12.     @Override 
  13.      public String transform(String str) {  
  14.         System.out.println("invoke UpperDecorator....");  
  15.         return str.toUpperCase();  
  16.     }  
  17. }  
 
 
 
 
  1. //轉(zhuǎn)為大寫(xiě)的裝飾器  
  2. public class UpperDecorator extends Decorator {  
  3.     public UpperDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         String transformtransform = transform(display);  
  10.         return transform;  
  11.     }  
  12.     @Override  
  13.     public String transform(String str) {  
  14.         System.out.println("invoke UpperDecorator....");  
  15.         return str.toUpperCase();  
  16.     }  
  17. }  
 
 
 
 
  1. //轉(zhuǎn)為小寫(xiě)的裝飾器  
  2. public class LowerDecorator extends Decorator{  
  3.     public LowerDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         String transformtransform = transform(display);  
  10.         return transform;  
  11.     }  
  12.     @Override  
  13.     public String transform(String str) {  
  14.         System.out.println("invoke lowerDecorator....");  
  15.         return str.toLowerCase();  
  16.     }  
  17. }  
 
 
 
 
  1. //裁剪、擴(kuò)充裝飾器  
  2. public class ExtendOrSplitDecorator extends Decorator {  
  3.     public ExtendOrSplitDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         String transformtransform = transform(display);  
  10.         return transform;  
  11.     }  
  12.     @Override  
  13.     public String transform(String str) {  
  14.         System.out.println("invoke ExtendOrSplitDecorator....");  
  15.         if (str != null) {  
  16.             if (str.length() > 10) {  
  17.                 return str.substring(0,10);  
  18.             }else{  
  19.                 int repeatCount = 10 -str.length();  
  20.                 StringBuilder sb = new StringBuilder(str);  
  21.                 for (int i = 0; i < repeatCount; i++) {  
  22.                     sb.append("!");  
  23.                 }  
  24.                 return sb.toString();  
  25.             }  
  26.         }  
  27.         return null;  
  28.     }  
  29. }  
 
 
 
 
  1. //裁剪、擴(kuò)充裝飾器  
  2. public class ExtendOrSplitDecorator extends Decorator {  
  3.     public ExtendOrSplitDecorator(ICompoment compoment) {  
  4.         super(compoment);  
  5.     }  
  6.     @Override  
  7.     public String display(String str) {  
  8.         String display = super.display(str);  
  9.         String transformtransform = transform(display);  
  10.         return transform;  
  11.     }  
  12.     @Override  
  13.     public String transform(String str) {  
  14.         System.out.println("invoke ExtendOrSplitDecorator....");  
  15.         if (str != null) {  
  16.             if (str.length() > 10) {  
  17.                 return str.substring(0,10);  
  18.             }else{  
  19.                 int repeatCount = 10 -str.length();  
  20.                 StringBuilder sb = new StringBuilder(str);  
  21.                 for (int i = 0; i < repeatCount; i++) {  
  22.                     sb.append("!");  
  23.                 }  
  24.                 return sb.toString();  
  25.             }  
  26.         }  
  27.         return null;  
  28.     }  
  29. }  
 
 
 
 
  1. //測(cè)試代碼  
  2. public static void main(String[] args) {  
  3.         //將輸入內(nèi)容轉(zhuǎn)為大寫(xiě),再反轉(zhuǎn)  
  4.         ReverseDecorator reverseDecorator = new ReverseDecorator(new UpperDecorator(new DetailCompoment()));  
  5.         String display = reverseDecorator.display("wo shi zhongguo ren.");  
  6.         System.out.println(display);  
  7.         //將輸入內(nèi)容轉(zhuǎn)為小寫(xiě),在裁剪或者擴(kuò)展 
  8.          ExtendOrSplitDecorator decorator = new ExtendOrSplitDecorator(new LowerDecorator(new DetailCompoment()));  
  9.         String display1 = decorator.display("I Love");  
  10.         System.out.println(display1);  
  11.         //將輸入內(nèi)容轉(zhuǎn)為小寫(xiě),再反轉(zhuǎn),然后加密  
  12.         EncodeDecorator decorator1 = new EncodeDecorator(new ReverseDecorator(new LowerDecorator(new DetailCompoment())));  
  13.         String display2 = decorator1.display("頂級(jí)機(jī)密:1941年12月 日本偷襲珍珠港! 銀行密碼是:1234ADC");  
  14.         System.out.println(display2);  
  15.         System.out.println("++++++++++");  
  16.         //將輸入內(nèi)容先反轉(zhuǎn)、再轉(zhuǎn)為小寫(xiě),然后加密  
  17.         EncodeDecorator decorator2 = new EncodeDecorator(new LowerDecorator(new ReverseDecorator(new DetailCompoment())));  
  18.         String display3 = decorator2.display("頂級(jí)機(jī)密:1941年12月 日本偷襲珍珠港! 銀行密碼是:1234ADC");  
  19.         System.out.println(display3);  
  20.         System.out.println("============");  
  21.         //對(duì)上面的加密內(nèi)容,進(jìn)行解密  
  22.         DecodeDecorator decodeDecorator = new DecodeDecorator(decorator1);  
  23.         String display4 = decodeDecorator.display("頂級(jí)機(jī)密:1941年12月 日本偷襲珍珠港! 銀行密碼是:1234ADC");  
  24.         System.out.println(display4);  
  25.     } 

控制臺(tái)輸出: 

 
 
 
 
  1. 原來(lái)內(nèi)容:wo shi zhongguo ren.  
  2. invoke UpperDecorator....  
  3. invoke ReverseDecorator....  
  4. .NER OUGGNOHZ IHS OW  
  5. 原來(lái)內(nèi)容:I Love  
  6. invoke lowerDecorator....  
  7. invoke ExtendOrSplitDecorator....  
  8. i love!!!!  
  9. 原來(lái)內(nèi)容:頂級(jí)機(jī)密:1941年12月 日本偷襲珍珠港! 銀行密碼是:1234ADC  
  10. invoke lowerDecorator....  
  11. invoke ReverseDecorator....  
  12. invoke EncodeDecorator....  
  13.  URSP[晎硠宧蠭釵A?湎玁玬裌倖?wèn)j斄A榪SP帕PUXP?宧杛細(xì)頗  
  14. ++++++++++  
  15. 原來(lái)內(nèi)容:頂級(jí)機(jī)密:1941年12月 日本偷襲珍珠港! 銀行密碼是:1234ADC  
  16. invoke ReverseDecorator....  
  17. invoke lowerDecorator....  
  18. invoke EncodeDecorator....  
  19.  URSP[晎硠宧蠭釵A?湎玁玬裌倖?wèn)j斄A榪SP帕PUXP?宧杛細(xì)頗  
  20. ============  
  21. 原來(lái)內(nèi)容:頂級(jí)機(jī)密:1941年12月 日本偷襲珍珠港! 銀行密碼是:1234ADC  
  22. invoke lowerDecorator....  
  23. invoke ReverseDecorator....  
  24. invoke EncodeDecorator....  
  25. invoke DecodeDecorator... 
  26.  cda4321:是碼密行銀 !港珠珍襲偷本日 月21年1491:密機(jī)級(jí)頂 

4.裝飾者模式在jdk中的應(yīng)用I/O

  •  InputStream 相當(dāng)于裝飾者模式的Component
  •  FileInputStream,ByteArrayInputStream,ObjectInputStream這些對(duì)象直接繼承了InputStream,相當(dāng)于裝飾者模式中的ConcreteComponent
  •  FilterInputStream 繼承了InputStream,并且持有了一個(gè)InputStream ,相當(dāng)于裝飾者模式中的Decorator
  •  BufferedInputStream,PushbackInputStream,LineNumberInputStream,DataInputStream繼承了FilterInputStream,相當(dāng)于裝飾者模式中的ConcreteDecorator 
 
 
 
 
  1.  //這里FileInputStream 相當(dāng)于組件對(duì)象,BufferedInputStream這個(gè)裝飾器裝飾了FileInputStream對(duì)象  
  2. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("fileName")));  
  3. byte[] buff = new byte[1024];  
  4. bis.read(buff);  
  5. System.out.println(new String(buff)); 

5.優(yōu)點(diǎn)、缺點(diǎn),使用場(chǎng)合

優(yōu)點(diǎn):

1.比繼承更靈活

  •  從為對(duì)象添加功能的角度來(lái)看,裝飾者模式比繼承更為靈活。繼承是靜態(tài)的,一旦繼承,所有的子類(lèi)都有一樣的功能。裝飾者模式采用把功能分離到每個(gè)裝飾器當(dāng)中,
  •  通過(guò)對(duì)象組合的方式,在運(yùn)行時(shí)動(dòng)態(tài)的組合功能,被裝飾對(duì)象最終由哪些功能,是由運(yùn)行時(shí)動(dòng)態(tài)組合的功能決定的。  

2.復(fù)用功能更容易

  •  裝飾模式把一系列復(fù)雜的功能分散到每個(gè)裝飾器中,一般情況下每個(gè)裝飾器只實(shí)現(xiàn)一個(gè)功能,使得實(shí)現(xiàn)裝飾器變得簡(jiǎn)單,有利于裝飾器功能的復(fù)用,可以給一個(gè)對(duì)象添加
  •  多個(gè)裝飾器,也可以把一個(gè)裝飾器裝飾多個(gè)對(duì)象,從而實(shí)現(xiàn)復(fù)用裝飾器的功能。

3.簡(jiǎn)化高層定義

  •  裝飾者模式可以通過(guò)組合裝飾器的方式,為對(duì)象添加任意多的功能;因此在高層定義的時(shí)候,不必把所有的功能都定義處理,只需要定義最基本的就可以了,在需要的時(shí)候可以
  •  通過(guò)組合裝飾器的方式來(lái)完成所需的功能。

缺點(diǎn):會(huì)產(chǎn)生較多的細(xì)粒度的對(duì)象

  •  裝飾模式把一系列復(fù)雜的功能分散到每個(gè)裝飾器中,一般情況下每個(gè)裝飾器只實(shí)現(xiàn)一個(gè)功能,這樣會(huì)產(chǎn)生很多細(xì)粒度的對(duì)象,并且功能越復(fù)雜,細(xì)粒度對(duì)象越多。

本質(zhì):動(dòng)態(tài)組合

注意:裝飾者模式只是改變組件對(duì)象的外觀Facde,并沒(méi)有改變其內(nèi)核

使用場(chǎng)合:

  •  如果需要再不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給對(duì)象增加職責(zé),可以使用裝飾者模式。
  •  如果不適合使用子類(lèi)進(jìn)行擴(kuò)展的時(shí)候,可以考慮使用裝飾者模式。裝飾者模式使用的是對(duì)象組合的方式。
  •  不適合子類(lèi)擴(kuò)展:比如擴(kuò)展功能需要的子類(lèi)太多,造成子類(lèi)數(shù)量呈爆炸性增長(zhǎng)。 

 

 


當(dāng)前名稱(chēng):這是我見(jiàn)過(guò)最通俗易懂的裝飾者模式講解了!
分享鏈接:http://m.5511xx.com/article/dheoode.html