日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式之_Iterator_03

發(fā)布時(shí)間:2024/4/13 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之_Iterator_03 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 考慮容器的可替換性package com.learn.dp.iterator;/*** Collection叫集合,是一個(gè)統(tǒng)一的集合,所有的實(shí)現(xiàn)類都要實(shí)現(xiàn)這個(gè)接口* 有了接口之后呢,我們就用接口的方式統(tǒng)一了,凡是實(shí)現(xiàn)了我這個(gè)接口的子類,* 肯定有add和size方法,* @author Leon.Sun**/ public interface Collection {/*** 我就不寫public了,因?yàn)閕nterface里面的方法都是public*/void add(Object o);int size(); } package com.learn.dp.iterator;/*** 我們讓ArrayList來實(shí)現(xiàn)Collection接口* @author Leon.Sun**/ public class ArrayList implements Collection {/*** 我在這里定義一個(gè)數(shù)組,模擬可以裝任意多個(gè)對象的容器* 我們現(xiàn)在 一個(gè)數(shù)組往里頭裝任何的對象,加入這個(gè)數(shù)組里面能裝10個(gè),* 一旦裝滿了之后,我就在這個(gè)數(shù)組的基礎(chǔ)上擴(kuò)展一些新的空間,一旦裝滿了就再擴(kuò)展新的空間* 這個(gè)時(shí)候我就可以往里頭裝任意多個(gè)對象了,所以這個(gè)寫法就簡單了,*/Object[] objects = new Object[10];/*** 默認(rèn)情況下一個(gè)都沒裝,index代表下一個(gè)空位置在哪里* 最開始一個(gè)都沒有裝,當(dāng)你裝的時(shí)候就在index這個(gè)位置上* 每當(dāng)我們添加一個(gè)新的進(jìn)來的時(shí)候,讓index++*/int index = 0;/*** 父類引用指向子類對象* 第一個(gè)容器我用數(shù)組來模擬,往里裝的時(shí)候要判斷一下,現(xiàn)在裝到哪了,* */public void add(Object o) {/*** 一旦你加到index==objects.length的時(shí)候,* 再往里面添加新對象的時(shí)候,超過他的容量了,這個(gè)時(shí)候把原來的數(shù)組做擴(kuò)展*/if(index==objects.length) {/*** 當(dāng)一個(gè)數(shù)組的容量不夠使了,我就new個(gè)新數(shù)組,新數(shù)組的容量是老數(shù)組的兩倍* 我們這么寫嚴(yán)格來講不是很科學(xué),兩倍兩倍一直乘下去話數(shù)量級會(huì)非常大,根據(jù)原來有多長再加多少,* 不過我們的重點(diǎn)并不是放在這個(gè)地方,所以我采取最簡單的方式,把原來的數(shù)組copy到新數(shù)組里面,* */Object[] newObjects = new Object[objects.length * 2];/*** 這里用到了System類的靜態(tài)方法* 這個(gè)方法要是不理解去讀API文檔,其實(shí)每次用到arraycopy文檔的時(shí)候總想罵SUN兩句* 如果按照J(rèn)AVA里面的變量駝峰標(biāo)識(shí)風(fēng)格的話,C一般大寫才對,可是這個(gè)C就是小寫* String類中的有一個(gè)substring第二個(gè)應(yīng)該是大寫,結(jié)果他還是小寫,個(gè)人柑橘非常的別扭* SUN有時(shí)候這些細(xì)節(jié)上不是非常的到位,很慶幸的是JAVA已經(jīng)被收購了,已經(jīng)不控制在SUN手里了* 這個(gè)世界感覺美好了很多* 第一個(gè)參數(shù)objects原來的數(shù)組* 第二個(gè)參數(shù)從哪里開始* 第三個(gè)參數(shù)拷貝到哪個(gè)數(shù)組去* 第四個(gè)參數(shù)目標(biāo)參數(shù)從哪里開始* 第五個(gè)參數(shù)是一共拷貝多少個(gè)* 原來數(shù)組滿了,所以一共拷貝這么多個(gè)*/System.arraycopy(objects, 0, newObjects, 0, objects.length);/*** 所以原來的引用就指向了新的數(shù)組*/objects = newObjects;}objects[index] = o;/*** 這樣index就記錄了我裝了多少個(gè)對象了* 每當(dāng)我添加一個(gè)新對象,index都要往上加*/index++;}/*** 作為一個(gè)容器別人一般會(huì)問你裝了多少個(gè)東西了* 調(diào)用它的時(shí)候告訴容器裝了多少個(gè)了*/public int size() {/*** 裝了index個(gè)了*/return index;}} package com.learn.dp.iterator;/*** LinkedList也讓他去實(shí)現(xiàn)Collection* @author Leon.Sun**/ public class LinkedList implements Collection {Node head = null;/*** 所以你會(huì)發(fā)現(xiàn)這樣一個(gè)問題,當(dāng)我們添加新節(jié)點(diǎn)的時(shí)候,如果我們知道哪個(gè)節(jié)點(diǎn)是最后一個(gè),* 那就爽很多了,因?yàn)槲覀冎灰屪詈笠粋€(gè)拉住我們的小手就可以* 所以我們可以這么寫*/Node tail = null;/*** 要有一個(gè)東西記錄到底有多少個(gè)元素了* 其實(shí)這個(gè)size是冗余數(shù)據(jù),你不記錄也可以* 但是我們有一個(gè)冗余數(shù)據(jù),沒添加一個(gè)就讓他加加* 最后只要return size就可以了*/int size = 0;/*** 當(dāng)我們往鏈表里添加一個(gè)節(jié)點(diǎn)的時(shí)候,這個(gè)時(shí)候我們該怎么做,* 當(dāng)然你要做各種判斷,第一個(gè)如果head本身就是空的話,那么作為你新添加進(jìn)來的內(nèi)容,* 它就是第一個(gè)節(jié)點(diǎn),添加進(jìn)來新的Object* * 加入我們已經(jīng)有了一個(gè)節(jié)點(diǎn)了,next指向一個(gè)空值,當(dāng)我們再往里面添加一個(gè)節(jié)點(diǎn)的時(shí)候,* 把新的節(jié)點(diǎn)放在右邊,把前面的next指向它,如果還有第三個(gè),新加進(jìn)來的就指向空值* * @param o*/public void add(Object o) {/*** 真正的內(nèi)容是傳進(jìn)來的o,它的next是沒有,所以只能傳一個(gè)空值*/Node n = new Node(o,null);/*** 如果添加進(jìn)來的是第一個(gè)節(jié)點(diǎn),那head就等于n* head等于空,head等于n,tail也等于n* 你是第一個(gè)的話你既是頭也是尾,如果tail不等于空,那就是一回事*/if(head==null) {head = n;tail = n;}/*** 把tail的這只小手*/tail.setNext(n);/*** tail要變成本身加入進(jìn)來的節(jié)點(diǎn)* 這樣一個(gè)新的節(jié)點(diǎn)就加入進(jìn)來了*/tail = n;size++;}public int size() {return size;}} package com.learn.dp.iterator;public class MainTest {public static void main(String[] args) {/*** 該用LinkedList* 我ArrayList用膩了,我就馬上改成LinkedList,其他的代碼不用變* 我現(xiàn)在并沒有任何一種機(jī)制來約束說這個(gè)方法就叫add,加入LinkedList里面的* 方法不叫add,叫addObject,那大家想一下,你從ArrayList換成LinkedList的時(shí)候* 那下面的話一定會(huì)發(fā)生改變,所以我們有必要定義這樣一種機(jī)制來把他們兩個(gè)公開的一些方法給他統(tǒng)一起來* 那我想大多人人能夠想到他的解決方案* * 我在定義定義具體容器的時(shí)候,*/// LinkedList ll = new LinkedList();/*** 一旦我不滿意了,我就換成LinkedList,放心下面一定都不會(huì)變* 原因是因?yàn)槲彝ㄟ^c來調(diào)的,通過c來調(diào)只能看到Collection的接口* 只能看到add和size方法,反正你是具體的子類,一定會(huì)實(shí)現(xiàn)這兩個(gè)方法,* 下面我只是針對接口編程,針對接口編程就不用考慮我到底的具體實(shí)現(xiàn)類是什么,* 所以你會(huì)發(fā)現(xiàn)你的程序會(huì)更靈活,因?yàn)槟阋鎿Q其他實(shí)現(xiàn)類的時(shí)候,只需要換一個(gè)地方* 如果你把這個(gè)東西放在配置文件里,你甚至連代碼都不用改,不知道剛剛講的有沒有明白,* 這就是他帶來的好處,面向接口編程,我們現(xiàn)在針對Collection接口編程,它具體的* 實(shí)現(xiàn)我不管他,代碼不用變,可以靈活的替代具體的實(shí)現(xiàn),我們定義這個(gè)就更好了,* 不過新的問題馬上就要來了,我們考慮容器的可替換性,我想把這個(gè)容器的元素給遍歷出來,* 把他們都給我遍歷出來,你該怎么做,* */Collection c = new ArrayList();for(int i=0;i<15;i++) {c.add(new Cat(i));}System.out.println(c.size());} }

?

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的设计模式之_Iterator_03的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。