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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式之_Strategy_05

發(fā)布時間:2024/4/13 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之_Strategy_05 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
你自己新定義的類,這個類怎么比較大小,當然應該你自己定義,你不實現(xiàn)誰實現(xiàn),你自己隨便新建的一個類,叫做蛇snake,當然要你自己實現(xiàn),我說的是原來寫好的排序的方法,從今以后再也不用變了,你不覺得這個世界美好了很多嗎,不然排序的方法還要自己寫,有人說這不是strategy策略模式,當然我還沒講到. package com.learn.stratege;/*** 現(xiàn)在我們有了Comparable接口感覺爽多了,* 原因很簡單,因為Comparable接口已經(jīng)幫我定義好這個個類怎么比較大小,* 這樣我們的方法就可以實現(xiàn)重用了,不過我們現(xiàn)在定義貓的大小,是根據(jù)他的高度height來定義誰大誰小,* 這種比較大小的方式,也是我寫定了的,加入我比較大小的時候,將來可能會發(fā)生改變,比如說我現(xiàn)在是通過貓的高度* 來比較的,沒準將來通過它的重量來比較大小,或者將來我通過高度和重量的值來比較大小,* 或者根據(jù)貓的胡子的長度來比較大小,這個時候你會發(fā)現(xiàn)貓的排序和前后位置會發(fā)生改變,* 那么我們現(xiàn)在這種結構能夠實現(xiàn)嗎,你實現(xiàn)不了,因為你實現(xiàn)Comparable接口之后,你只能寫一種實現(xiàn)* 你不能夠把兩只貓的全部是實現(xiàn)都寫出來是不可以的,那這事就麻煩了,我現(xiàn)在這樣的排序方法能重用,* 你給我這個對象排順序的時候我能夠靈活的指定這兩個對象到底怎么樣算誰大誰小,* 而并不是說我寫死在程序里,如果你是第一次接觸到這種設計,我相信你想出來并不是這么容易,* 不過你記住了,一旦需要你靈活的指定某些實現(xiàn)的時候,也就是你將來要以不確定的方式來擴展這個系統(tǒng)的時候* 多態(tài)是永遠都少不了的,這事就麻煩了,怎么做呢* * sort方法只要你實現(xiàn)了Comparable接口的compareTo的方法,不過麻煩的事在于這些個對象所實現(xiàn)的compareTo方法* 只有一種實現(xiàn),你不能寫太多,假如將來有現(xiàn)在還不能確定比較大小的方法,那我就沒法寫了,我如果將來想隨意的比較誰打誰小,* 想擴展這樣的方法,這個時候這個類我該怎么設計呢,講到這兒我不知道大家有沒有發(fā)現(xiàn)這么一個問題,* 設計模式是什么,就是把簡單的問題復雜化,確實如此,設計模式就是把簡單的問題復雜化,* 但是它復雜的有理有據(jù),就看你將來想在哪個方向上進行擴展,他就在那個方向上產(chǎn)生多態(tài),* 在那個方向上產(chǎn)生抽象,就在那個方向上進行復雜化,這個東西也是面向對象的核心,如果面向對象的核心老是有一個類太簡單了* 類和類之間的關系太簡單了,你感受不到系統(tǒng)之間精妙的結構,那種樂趣,你現(xiàn)在學設計模式學完了之后慢慢的感受到這才是* 面向對象的樂趣所在,這才是精華所在,怎么樣可以用自己定義的比較大小的方式,來對我們的系統(tǒng)進行擴展* * 既然我們現(xiàn)在要對比較大小的方式進行擴展,那么著方式肯定不能定義為具體的,定義為抽象的,* * @author Leon.Sun**/ public class DataSorter {public static void sort(Object[] a) {for(int i=a.length;i>0;i--) {for(int j=0;j<i-1;j++) {Comparable o1 = (Comparable)a[j];Comparable o2 = (Comparable)a[j+1];if((o1.compareTo(o2))==1) {swap(a,j,j+1);}}}}private static void swap(Object[] a, int x, int y) {Object temp = a[x];a[x] = a[y];a[y] = temp;}public static void sort(int[] a) {for(int i=0;i<a.length;i--) {for(int j=0;j<i-1;j++) {if(a[j]>a[j+1]) {swap(a,j,j+1);}}}}private static void swap(int[] a, int x, int y) {int temp = a[x];a[x] = a[y];a[y] = temp;}public static void p(int[] a) {for(int i=0;i<a.length;i++) {System.out.print(a[i] + " ");}System.out.println();}public void p(Object[] a) {for(int i=0;i<a.length;i++) {System.out.print(a[i] + " ");}System.out.println();}} package com.learn.stratege;/*** 大小比較器,既然是一種大小比較器,他就應該有一個compare方法* @author Leon.Sun**/ public interface Comparator {/*** JDK里也叫compare方法,我要定義兩個對象的誰打誰小* 具體實現(xiàn)這個接口的類來定義這兩個對象誰大誰小,* 如果o1大于o2返回正值,加入o1小于o2返回負值,加入相等就返回0* inteface里面的方法默認都是public的,所以你不用寫* 假如我想定義貓之間的比較,貓最開始是用高度來比較,*/int compare(Object o1, Object o2);} package com.learn.stratege;public class CatHeightComparator implements Comparator {/*** 我寫簡單的實現(xiàn)*/@Overridepublic int compare(Object o1, Object o2) {/*** 先強制轉化兩只貓*/Cat c1 = (Cat)o1;Cat c2 = (Cat)o2;/*** 然后判斷他們兩個的大小*/if(c1.getHeight()>c2.getHeight()) {return 1;}else if(c1.getHeight()<c2.getHeight()) {return -1;}return 0;}} package com.learn.stratege;public class Cat implements Comparable {private int height;/*** 講到這里我分析類和類之間的關系,擁有一個比較器,但是這個比較器是一個具體的子類的實現(xiàn)* 比如默認是根據(jù)高度來比較的比較器* * 如果new的不是CatHeightComparator,而是根據(jù)重量來比較的一個比較器* 你會發(fā)現(xiàn)它會根據(jù)重量來比較大小,也就是說當它使用Comparator來比較大小的時候* 你會發(fā)現(xiàn)世界又美好了一些,因為我寫完這個類之后呢,我們可以 定義兩個對象到底誰算大* 誰算小,這樣我的擴展能力就更強了,*/// private Comparator comparator = new CatHeightComparator();private Comparator comparator = new CatWeightComparator();private int weight;public Cat() {super();}public Cat(int height, int weight) {super();this.height = height;this.weight = weight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}@Overridepublic String toString() {return "Cat [height=" + height + ", weight=" + weight + "]";}public Comparator getComparator() {return comparator;}public void setComparator(Comparator comparator) {this.comparator = comparator;}/*** 我可以交給一個具體的比較邏輯,再幫我比較* 這個時候你就會發(fā)現(xiàn)這么一種好處,加入我現(xiàn)在對高度比較器不滿意了,* 我換成new別的就可以了,更好的一種方式,大家看桌面,* 就看你給我貓設置什么樣的比較器,*/@Overridepublic int compareTo(Object o) {/*** 當我們使用compare比較大小的時候,我是把具體比較大小的邏輯交給具體的這個comparator他去比較* 有這樣一個邏輯大家想想看,具體你new什么樣的邏輯出來,他當然就會根據(jù)什么樣的邏輯去比較大小* */return comparator.compare(this, o);}} package com.learn.stratege;public class CatWeightComparator implements Comparator {@Overridepublic int compare(Object o1, Object o2) {/*** 先強制轉化c1,c2*/Cat c1 = (Cat)o1;Cat c2 = (Cat)o2;/*** 我們現(xiàn)在是重量越重的貓越小* 所以你拿到這只貓的重量,大于另一只貓的重量,* 目的是為了看出排序的順序來* 重量越重的貓就排在前面了*/if(c1.getWeight()>c2.getWeight()) {return -1;}else if(c1.getWeight()<c2.getWeight()) {return 1;}return 0;}} package com.learn.stratege;/*** 你可以發(fā)現(xiàn)他已經(jīng)排好順序了* @author Leon.Sun**/ public class Test {public static void main(String[] args) {DataSorter dataSorter = new DataSorter(); /*** 順序是怎么排的,當你new出三只貓出來的時候,我們把貓交給Sort方法,*/Cat[] a = {new Cat(8,8),new Cat(2,2),new Cat(1,1)};dataSorter.sort(a);dataSorter.p(a);Dog[] d = {new Dog(6),new Dog(4),new Dog(2)};dataSorter.sort(d);dataSorter.p(d);} }

?

總結

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

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