Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 設計模式之策略模式

設計模式之策略模式

編輯:關於Android編程

概要

設計模式是一門藝術,如果真正了解這門藝術,你會發現,世界都將變得更加優美。

定義

策略模式定義了一系列的算法,並將每一個算法封裝起來,他們之間還可以相互替換,策略模式獨立於使用它的客戶而獨立變化

使用場景

1.同一類問題的多種處理方式
2.安全的封裝多種同一類型的操作
3.同一抽象類有多個子類,需要if-else來選擇具體的子類

UML

這裡寫圖片描述

以上類圖,非常簡單,不用做過多解釋,在使用設計模式演示例子之前,大家先看下下面這個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。。。。。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved