編輯:關於Android編程
設計模式是一門藝術,如果真正了解這門藝術,你會發現,世界都將變得更加優美。
策略模式定義了一系列的算法,並將每一個算法封裝起來,他們之間還可以相互替換,策略模式獨立於使用它的客戶而獨立變化
1.同一類問題的多種處理方式
2.安全的封裝多種同一類型的操作
3.同一抽象類有多個子類,需要if-else來選擇具體的子類
以上類圖,非常簡單,不用做過多解釋,在使用設計模式演示例子之前,大家先看下下面這個demo<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
1.Tactics
抽象策略的接口,內部含有一個方法
2.ATactics
具體的A策略實現
案例分析
(1)動畫案例
package com.zengtao.demo.tactics;
public class Animations {
public static final int ALPHA = 1;
public static final int TRANSLATION = 2;
public static final int SCALE = 3;
private void showAlpha() {
System.out.println("view ----> 淡入動畫");
}
private void showTranslation() {
System.out.println("view ----> 平移動畫");
}
private void showScale() {
System.out.println("view ----> 縮放動畫");
}
public void show(int type) {
if (type == ALPHA) {
showAlpha();
} else if (type == TRANSLATION) {
showTranslation();
} else if (type == SCALE) {
showScale();
}
}
}
(2)調用
package com.zengtao.demo;
import com.zengtao.demo.tactics.Animations;
public class Main {
public static void main(String[] str) {
Animations animations = new Animations();
animations.show(1);
System.out.println();
System.out.println("*****改變動畫*****");
System.out.println();
animations.show(2);
}
}
(3)結果
大家看上面的demo,我實現的是一個view,添加動畫的一個效果(偽代碼),是不是非常簡單,大家覺得上面的代碼有問題麼?很顯然,上面的所有代碼按照邏輯來講,是沒有問題的,一步一步執行下來,調理好像也很清晰,也能實現具體的效果,那麼我來告訴大家,上面的代碼其實是有很大的問題的,怎麼說呢,你想,如果我需要添加一種動畫,那我是不是要去修改這個類,要做什麼修改呢?
1.添加一個int值,作為動畫的類型
2.新增一個showXXX動畫的方法
3.修改判斷邏輯if-else
大家可能會想,看起來也很簡單啊,也就這樣改改而已,但是大家要知道以下幾點:
1、如果後續再增加,在增加,臥槽了,怎麼辦呢,這個類越來越臃腫,越來越龐大,維護成本越來越高
2、我們在編碼的時候,提倡的是新增,而不是修改以前的東西,這樣很容易造成錯誤,非常不利於擴展,也屬於硬編碼行為
3、這其實是屬於偽代碼,如果實際情況,你還不得淚崩啊。。。
我們Java是面向對象的思想,怎麼能這樣做呢,那麼如何解決?
很顯然,答案:策略模式
代碼演示
上面的類圖我們已經很清晰的明白了他們之間的關系,所以接下來就用代碼演示,將上面我們的想法和邏輯用代碼表現出來:
(1)抽象動畫接口
package com.zengtao.demo.tactics;
public interface ITactics {
String animation();
}
(2)具體動畫
1.淡入動畫
package com.zengtao.demo.tactics;
public class AlphaAnimation implements ITactics {
@Override
public String animation() {
return "淡入動畫";
}
}
2.縮放動畫
package com.zengtao.demo.tactics;
public class ScaleAnimation implements ITactics {
@Override
public String animation() {
return "縮放動畫";
}
}
3.平移動畫
package com.zengtao.demo.tactics;
public class TranslationAnimation implements ITactics {
@Override
public String animation() {
return "平移動畫";
}
}
(3)調用
package com.zengtao.demo;
import com.zengtao.demo.tactics.AlphaAnimation;
import com.zengtao.demo.tactics.Animation;
import com.zengtao.demo.tactics.TranslationAnimation;
public class Main {
public static void main(String[] str) {
Animation animation = new Animation();
AlphaAnimation alphaAnimation = new AlphaAnimation();
animation.setiTactics(alphaAnimation);
animation.showAnimation();
System.out.println();
System.out.println("*****改變動畫*****");
System.out.println();
TranslationAnimation translationAnimation = new TranslationAnimation();
animation.setiTactics(translationAnimation);
animation.showAnimation();
}
}
(4)結果
總結
看到了麼,我們用策略模式,非常優雅的解決了我們之前的問題,如果我們要增加一個新的動畫,那我們直接實現ITactics就好了,完全不用去修改其它的類,只需實現動畫的具體實現方式就好了,既降低了維護成本同時又減少了出現錯誤的概率
現在是否有感覺設計模式其實非常爽,是不是,好了,以上就是策略模式的相關知識點了,當然如果你想要更加深入了解,請去閱讀Android 動畫相關的源碼,比如插值器等,或者其他Android 使用到的策略模式,ImageLoader的加載圖片方式,在具體開發過程中,我們的策略模式其實還挺多的。
請尊重他人勞動成果,歡迎大家坐沙發的坐沙發,轉載的轉載,分享的分享,希望對大家有所幫助,tks。。。。。
今天隨便逛逛CSDN,看到主頁上推薦了一篇文章Android 快速開發系列 打造萬能的ListView GridView 適配器,剛好這兩天寫項目自己也封裝了類似的Com
前段時間做了一個失敗的圖像處理項目,結果雖然不太好,也學到了不少東西,其中關於在Eclipse裡如何使用opencv的圖片處理api折騰了一陣子,記錄一下:1、Andro
用戶登錄注冊界面開發及用戶信息管理案例詳解剛開始接觸Android編程,這算是我寫的第一個簡單工程,主要功能有:用戶登錄、注冊、注銷、修改密碼、記住密碼共5個基本操作,其
今天我們來講解一下如何創建及調用自己的ContentProvider。在前面兩篇文章中我們分別講了如何讀寫聯系人和短消息,相信大家對於ContentProvider的操作