直掛云帆濟滄海,展翅遨翔登九天!

          我要飛得更高...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            19 隨筆 :: 0 文章 :: 5 評論 :: 0 Trackbacks

          2008年8月15日 #

                  從這一階段開始講述軟件設計模式,我也不再講GoF的神奇歷史,直接進入正題。在進行模式講解的同時,對于本人來說,一方面也是進行了復習,另一方面也是通過講解使自己對這些模式的使用上達到一個更加理解的層次。搞軟件的朋友都知道,在進行開發過一段時間后,會發現自己大學里學習的基礎課很重要。而目前很多朋友對軟件的理解都非常膚淺,只知道增刪改查,試用這樣的程序員能存活多久,思考很重要,學習很重要,理解很重要,領悟更重要。讓浮燥的程序員回歸理性吧,模式可能讓浮燥的心情得到凈化,在模式中進行思考,在模式中進行領悟吧。
                  第一講是裝飾器。當初我在學裝飾器模式的時候總是感覺似懂非懂,一直沒有真正理解。其實裝飾器也叫油漆工模式,再加上在我們的java類庫中有很多是實現了裝飾器模式的類。比方說:在讀取文件時
          FileReader fr = new FileReader(filename);
          BufferedReader br = new BufferedReader(fr);
          這其實就是一個decorator模式。因為針對File的讀取方式有很多,如果每種都要采用繼承的方法,那么會產生很多的子類,那樣顯然是很煩的。
                    裝飾器也稱為油漆工模式。它的目的就是給一個對象動態地添加一些功能。就像是給對象刷了一層漆,使這個對象更加豐富,而不是通過繼承來增加功能。而這些功能的添加是動態的運行期的,當然這里的動態并不是像aop中的引介introductor,大家不要混淆。
                    在我們的項目中,經常會遇到日志的情況。大凡我們會定義一個log接口就像下面。
          public interface Logger {
              public void log(String msg);
          }
          一般我們會把日志保存中文件中,所以有了一個FileLogger

          public class FileLogger implements Logger {

           public void log(String msg) {
                  //開始記錄日志到文件中
           }
          }
          此時如果在項目有些地方需要對日志進行加密,有些地方又不需要加密,或者有些地方生成的文件是以xml的方式。此時如果采用繼承的方法,也能實現,但是從面向對象的角度來說,并不建議對象的層次太深,增加系統的復雜性,這樣對于系統的擴展和維護都不是很方便。此時Decorator模式就可以幫我們解決這些問題,我們可以為這個一般的FileLogger對象上刷一層不同的漆,那么這些漆,從上面增加的功能角度來說,就是加了一個“加密”的漆,或加了一層“生成xml”的漆。
          先定義一個Decorator接口,此接口也實現了Logger接口
          public class LoggerDecorator implements Logger{
             Logger logger;
             public LoggerDecorator(Logger logger){
                  this.logger=logger;
             }
             //開始記錄日志
             public void log(String msg){
                 //此處便是給實現了Logger接口的,被刷了油漆的(增加了功能的例如加密等)對象記錄日志
                 logger.log(msg);
             }
          }
          public class EncryptDecorator extends LoggerDecorator{
              public EncryptDecorator(Logger logger){
                  super(logger);
              }
              public void log(String msg){
                  //刷加密字符串的油漆
                  msg=this.encryptMsg(msg);
                  //記錄加密后的日志
                  logger.log(msg);
              }
          }
          //客戶端的調用
          public DecoratorClient{
              public static void main(String args[]){
                   Logger logger=new FileLogger();
                   Logger decorator=new EncryptDecorator(logger);
                   decorator.log("加密的字符串");
             }
          }
          這樣就基本把Decorator模式的應用起來,當然在項目中我們可能還需要更豐富一下我們的類,此處僅用這樣的簡單示例來講述。

          posted @ 2008-08-18 23:11 周大俠 閱讀(445) | 評論 (1)編輯 收藏

                   網上google一下,想找一些有用的資料,結果是搜了不少,誰知道都是轉載,而且相同的文章太多太多,達到了泛濫的地步,然后冒充自己的文章,也不提是轉載,貌似增加了網絡搜索資料的途徑,實是浪費真正想找資料的朋友的時間,殊不知別人的時間都是有限的,每次打開一個頁面結果卻都是相同的內容,你叫人氣不氣,擾亂了整個網絡的制序,損人利己,濫宇充數。
              網上的資料不是不可轉載,但請轉載者在盲目轉載的同時,請提出自己的看法意見,留下有用的信息,否則亂貼在自己的blog只會讓真正的有志之士所看不起,如果您無法原創,就請您把您的blog關閉。
              清除網絡垃圾,還我們一片干凈的網絡空間!!!
          posted @ 2008-08-15 23:35 周大俠 閱讀(196) | 評論 (1)編輯 收藏

                  Java中有關數據結構的類都在java.util包中,集合框架是每一個程序員都應該熟練掌握的一個類庫。Java的集合框架可以提供處理對象的標準方式。在很早的jdk版本中,只提供了Dictionary、Vector、Stack、Properties來存儲和操作對象。這些類之間沒有統一的api,使用這些類達不到易擴展的作用。
                  當然我們使用這些數據結構目的也是為了使用方便,能夠提供高效的存取。學過數據結構的朋友們都知道,鏈表和哈希表的結構的效率都是較高的。為了使用不同的集合之間能夠相互操作,相互擴展,那么使用通用的接口將是一個較好的選擇。所以整個集合框架被設計成了一系列的標準的接口。在Collections類中有許多靜態的算法方法。Iterator迭代器接口提供了通用的訪問集合元素的方式,因為每一個集合都實現了Iterator接口。除了集合,還提供了映射的接口和類。比方說Map就提供了存儲鍵值對。雖然它不是集合,但也被整合到了集合中。目前所有的集合都是基于泛型的。
                  下面介紹集合框架中的幾個常用的接口:
          1.Collection 允許處理一組對象,位于集合層次結構的頂部
          2.List  擴展Collection接口以處理序列
          3.Queue  擴展Collection接口以處理列表中的特殊類型,其元素只能從前面刪除
          4.Set  擴展Collection接口以處理集合,集合中的元素必須是唯一的
          5.SortedSet  擴展Set接口以處理排序的集合
          當然除了上述的接口外,集合中還使用Copmarator、Iterator、ListIterator等接口 。
                  Collection接口是構造集合框架的基礎,必須被定義集合的任意類實現,同樣它也是一個泛型接口。
          方法摘要
           boolean add(E o)
                    確保此 collection 包含指定的元素(可選操作)。
           boolean addAll(Collection<? extends E> c)
                    將指定 collection 中的所有元素都添加到此 collection 中(可選操作)。
           void clear()
                    移除此 collection 中的所有元素(可選操作)。
           boolean contains(Object o)
                    如果此 collection 包含指定的元素,則返回 true。
           boolean containsAll(Collection<?> c)
                    如果此 collection 包含指定 collection 中的所有元素,則返回 true
           boolean equals(Object o)
                    比較此 collection 與指定對象是否相等。
           int hashCode()
                    返回此 collection 的哈希碼值。
           boolean isEmpty()
                    如果此 collection 不包含元素,則返回 true。
           Iterator<E> iterator()
                    返回在此 collection 的元素上進行迭代的迭代器。
           boolean remove(Object o)
                    從此 collection 中移除指定元素的單個實例,如果存在的話(可選操作)。
           boolean removeAll(Collection<?> c)
                    移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。
           boolean retainAll(Collection<?> c)
                    僅保留此 collection 中那些也包含在指定 collection 的元素(可選操作)。
           int size()
                    返回此 collection 中的元素數。
           Object[] toArray()
                    返回包含此 collection 中所有元素的數組。
          <T> T[]
          toArray(T[] a)
                    返回包含此 collection 中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。
          List接口:
          該接口擴展了Collection接口,它聲明集合是存儲一個序列的元素。我們可以把它看成是動態數組。學過數據結構的朋友都知道,數組可以使用基于0的索引,對于泛型的List接口而言,他可以指定保存不同的對象類型。
          方法摘要
           boolean add(E o)
                    向列表的尾部追加指定的元素(可選操作)。
           void add(int index, E element)
                    在列表的指定位置插入指定元素(可選操作)。
           boolean addAll(Collection<? extends E> c)
                    追加指定 collection 中的所有元素到此列表的結尾,順序是指定 collection 的迭代器返回這些元素的順序(可選操作)。
           boolean addAll(int index, Collection<? extends E> c)
                    將指定 collection 中的所有元素都插入到列表中的指定位置(可選操作)。
           void clear()
                    從列表中移除所有元素(可選操作)。
           boolean contains(Object o)
                    如果列表包含指定的元素,則返回 true。
           boolean containsAll(Collection<?> c)
                    如果列表包含指定 collection 的所有元素,則返回 true。
           boolean equals(Object o)
                    比較指定的對象與列表是否相等。
           E get(int index)
                    返回列表中指定位置的元素。
           int hashCode()
                    返回列表的哈希碼值。
           int indexOf(Object o)
                    返回列表中首次出現指定元素的索引,如果列表不包含此元素,則返回 -1。
           boolean isEmpty()
                    如果列表不包含元素,則返回 true
           Iterator<E> iterator()
                    返回以正確順序在列表的元素上進行迭代的迭代器。
           int lastIndexOf(Object o)
                    返回列表中最后出現指定元素的索引,如果列表不包含此元素,則返回 -1。
           ListIterator<E> listIterator()
                    返回列表中元素的列表迭代器(以正確的順序)。
           ListIterator<E> listIterator(int index)
                    返回列表中元素的列表迭代器(以正確的順序),從列表的指定位置開始。
           E remove(int index)
                    移除列表中指定位置的元素(可選操作)。
           boolean remove(Object o)
                    移除列表中出現的首個指定元素(可選操作)。
           boolean removeAll(Collection<?> c)
                    從列表中移除指定 collection 中包含的所有元素(可選操作)。
           boolean retainAll(Collection<?> c)
                    僅在列表中保留指定 collection 中所包含的元素(可選操作)。
           E set(int index, E element)
                    用指定元素替換列表中指定位置的元素(可選操作)。
           int size()
                    返回列表中的元素數。
           List<E> subList(int fromIndex, int toIndex)
                    返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之間的部分視圖。
           Object[] toArray()
                    返回以正確順序包含列表中的所有元素的數組。
          <T> T[]
          toArray(T[] a)
                    返回以正確順序包含列表中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。
          相對于Collection接口而言,List接口增加了add(int index, E element),add(int index,Collection c)方法,這些方法用于將元素插入到特定的位置,這也是動態數組的特性。
          Set接口:
          該接口擴展了Collection接口,但不允許有相同的存在的元素,而上述的List接口卻沒有此約束,其實很好理解,我們可以把它想象成數學中的集合,在那種集合中,是不允許有相同的元素的。
          SortedSet接口擴展了Set接口,此接口是升序的集合,由于是有序的,所有自然其中的數據元素是有意義的,否則升序的算法無從使用起。自然就不能存在為null的對象。下表是該接口特有的方法:
          方法摘要
           Comparator<? super E comparator()
                    返回與此有序集合關聯的比較器,如果使用元素的自然順序,則返回 null。
           E first()
                    返回此有序集合中當前第一個(最小的)元素。
           SortedSet<E> headSet(E toElement)
                    返回此有序集合的部分視圖,其元素嚴格小于 toElement。
           E last()
                    返回此有序集合中最后一個(最大的)元素。
           SortedSet<E> subSet(E fromElement, E toElement)
                    返回此有序集合的部分視圖,元素范圍從 fromElement(包括)到 toElement(不包括)。
           SortedSet<E> tailSet(E fromElement)
                    返回此有序集合的部分視圖,其元素大于或等于 fromElement。
          Queue接口:
          這個接口在1.4的版本中是沒有,新增的??疵志椭朗顷犃?,先進先出。
          方法摘要
           E element()
                    檢索,但是不移除此隊列的頭。
           boolean offer(E o)
                    如果可能,將指定的元素插入此隊列。
           E peek()
                    檢索,但是不移除此隊列的頭,如果此隊列為空,則返回 null
           E poll()
                    檢索并移除此隊列的頭,如果此隊列為空,則返回 null。
           E remove()
                    檢索并移除此隊列的頭。
          從隊列頂部刪除元素 。
          posted @ 2008-08-15 19:03 周大俠 閱讀(252) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 北宁市| 文安县| 遂宁市| 铜川市| 盐源县| 滦南县| 周口市| 安多县| 北安市| 新建县| 云梦县| 监利县| 利津县| 垦利县| 乌海市| 昌黎县| 高雄市| 会泽县| 常宁市| 柳河县| 临泉县| 壶关县| 塘沽区| 福贡县| 文成县| 荥经县| 洞头县| 织金县| 鄂托克前旗| 巴林左旗| 双桥区| 读书| 五原县| 湘阴县| 永寿县| 崇文区| 新和县| 朝阳县| 左权县| 缙云县| 南昌县|