<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    java設計模式:裝飾模式

    時間:2025-04-09 09:06:51 java語言 我要投稿
    • 相關推薦

    java設計模式:裝飾模式

      導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。下面我們來看看裝飾模式,希望對大家有所幫助。

      裝飾模式(Decorator Pattern):

      在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

      特點:

      (1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互

      (2) 裝飾對象包含一個真實對象的引用(reference)

      (3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。

      (4) 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。

      ★ 場景和問題

      在不對原有對象類進行修改的基礎上,如何給一個或多個已有的類對象提供增強額外的功能?

      裝飾模式就可以實現該功能。同時繼承原有類,也能實現該功能

      這里模擬實現BufferReader中的readLine()方法,模擬一個帶緩存的myRead()方法,對原有的read()方法進行增速

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package cn.hncu.pattern.decorator.v1;          
    import java.io.FileReader;          
    import java.io.IOException;          
    public class MyBufferedReader {          
       private FileReader r; //封裝一個對象          
                 
       private char[] cbuf = new char[1024];          
       private int count=0; //記錄當前緩沖區中字符的個數          
       private int pos=0; //數組元素的下標(當前讀取的位置)          
                 
       public MyBufferedReader(FileReader r ){          
           this.r = r;          
       }          
                 
       public int myRead() throws IOException {          
           //對read()方法的功能加強          
           if(count<=0){          
               count = r.read(cbuf);          
               if(count==-1){          
                   return -1;//代表讀取到文件末尾          
               }          
               pos=0;          
           }          
                     
           char ch = cbuf[pos];          
           count--;          
           pos++;          
                     
           return ch;          
       }          
                 
       public String myReadLine() throws IOException{          
           //模擬readLine()方法          
           StringBuilder sb = new StringBuilder();          
           int ch=0;          
           while( (ch=myRead())!=-1 ){          
               if(ch==' '){          
                   continue;          
               }          
               if(ch==' '){          
                   return sb.toString();          
               }          
                         
               sb.append((char)ch);          
           }          
           if(sb.length()!=0){          
               return sb.toString();          
           }          
           return null;          
       }          
                 
       public void myClose() throws IOException{          
           r.close();          
       }          
                 
    }          

      a.txt

    1
    2
    3
    4
    5
    ?sd2332uew          
    wekjewkjewjk          
    dfiuewi3223          
    ——————————Over----------          

      測試

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    package cn.hncu.pattern.decorator.v1;          
    import java.io.BufferedReader;          
    import java.io.DataInputStream;          
    import java.io.FileNotFoundException;          
    import java.io.FileReader;          
    import java.io.IOException;          
    import org.junit.Test;          
    public class TestMyBufferedReader {          
                 
       ////////////1 測試對read()的增強//////////////////////          
                 
       @Test          
       public void bufferedReaderDemo() throws Exception{          
           //javaAPI中的類          
           FileReader r = new FileReader("a.txt");          
           BufferedReader br = new BufferedReader(r);          
           int ch=0;          
           while( (ch=br.read())!=-1){          
               System.out.print((char)ch);          
           }          
           br.close();          
       }          
       /* 測試結果:          
        * ?sd2332uew          
        * wekjewkjewjk          
        * dfiuewi3223          
        *          
        * ——————————Over----------          
        */          
       @Test          
       public void myBufferedReaderDemo() throws Exception{          
           //我們自己寫的類          
           FileReader r = new FileReader("a.txt");          
           MyBufferedReader br = new MyBufferedReader(r);          
           int ch=0;          
           while( (ch=br.myRead())!=-1){          
               System.out.print((char)ch);          
           }          
           br.myClose();          
       }          
       /* 測試結果:          
        * ?sd2332uew          
        * wekjewkjewjk          
        * dfiuewi3223          
        *          
        * ——————————Over----------          
        */          
                 
       ///////////2 測試對readLine()的增強/////////////////////          
       @Test          
       public void testBufferedReadLineDemo() throws IOException{          
           //javaAPI中的類          
           BufferedReader br =new BufferedReader( new FileReader("a.txt"));          
           String str=null;          
           while( (str=br.readLine())!=null ){          
               System.out.println(str);          
           }          
           br.close();          
       }          
       /* 測試結果:          
        * ?sd2332uew          
        * wekjewkjewjk          
        * dfiuewi3223          
        *          
        * ——————————Over----------          
        */          
       @Test          
       public void testMyBufferedReadLineDemo() throws IOException{          
           //我們自己寫的類          
           MyBufferedReader br =new MyBufferedReader( new FileReader("a.txt"));          
           String str=null;          
           while( (str=br.myReadLine())!=null ){          
               System.out.println(str);          
           }          
           br.myClose();          
       }          
       /* 測試結果:          
        * ?sd2332uew          
        * wekjewkjewjk          
        * dfiuewi3223          
        *          
        * ——————————Over----------          
        */          
    }          

    【java設計模式:裝飾模式】相關文章:

    java設計模式:多例模式08-12

    java設計模式:工廠模式05-27

    java設計模式:DAO模式03-13

    JAVA設計模式之單例模式07-29

    Java單例設計模式04-25

    解析Java的設計模式編程之解釋器模式的運用05-19

    Java的設計模式編程中責任鏈模式的運用的實例講解07-07

    Java的結構型模式07-09

    簡單講解Java的Future編程模式方案03-24

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人