Android 策略模式 接口的调用

1、策略模式介绍

1)实现某一功能可能会有不同的算法,不同的策略。我们根据不同的实际情况,选择不同的策略。
2)策略模式定义了一系列的算法,并将每个算法封装起来,并且他们还都可以相互替换。

2、使用场景

1)针对同一类型问题的多种处理方式,仅仅是具体行为的差别。
2)需要安全的封装多种同意类型的操作
3)在需要使用 if else switch case 的地方

3、UML 类图

在这里插入图片描述

4、策略模式的简单实现

举个示例 :
以创建公交车 和 地铁 收费系统为例。
如果使用 if-else switch-case 在代码里进行 判断,会导致 很大的冗余,并且 以后添加、修改都是比较麻烦的。
我们可以把每种算法独立成一个函数,然后外部调用对应的方式即可。

1)文件结构

在这里插入图片描述
(1)CalculateStrategy 接口文件 定义了接口的类型
(2)BusStrategy 汽车的收费的方式
(3)SubwayStrategy 地铁的收费方式
(4)MainActivity 调用不同收费的地方

2)CalculateStrategy 接口文件
package com.example.ubuntu.mycalculatestragegy;

public interface CalculateStrategy  {

    int calculatePrice(int km) ;
}

3)BusStrategy 公交收费策略
package com.example.ubuntu.mycalculatestragegy;


//公交车计算价格的策略
public class BusStrategy implements CalculateStrategy {

    private String TAG = "BusStrategy: ";
    //假设十公里以内1 元,超过十公里 每加亿元乘坐 5 公里
    @Override
    public int calculatePrice(int km) {
        int extraTotal = km - 10;  //超过十公里的总距离
        int extraFactor = extraTotal / 5;  //超出的距离是 5的 几倍
        int fraction = extraFactor % 5;  //超过的距离对 5 公里取余

        int price = 1 + extraFactor * 1;   //价格计算
        System.out.println(TAG + "汽车 价格");
        return  fraction > 0 ? ++price : price;
    }
}

4)地铁收费策略
package com.example.ubuntu.mycalculatestragegy;

public class SubwayStrategy implements CalculateStrategy {

    private String TAG = "SubwayStrategy: ";

    //地铁价格计算策略
    /*
    * 6Km 内  3 元
    * 6~12km  4 元
    * 12~22km 5 元
    * 22~32Km 6 元
    * */
    @Override
    public int calculatePrice(int km) {
        System.out.println(TAG + "地铁 价格");
        if (0 < km && km <= 6) {
            return 3;
        } else if (km > 6 && km < 12) {
            return 4;
        } else if (km > 12 && km < 22){
            return  5;
        } else  if(km > 22 && km < 32){
            return 6;
        } else {
            return 7;
        }

    }

}



5)MainActivity 调用不同 收费策略
package com.example.ubuntu.mycalculatestragegy;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends Activity {

    private String TAG = "MainActivity: ";

    private CalculateStrategy calculateStrategy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        calculateStrategy = (CalculateStrategy) new BusStrategy();
       System.out.println(TAG + "car price:" +  calculateStrategy.calculatePrice(20));


        calculateStrategy = (CalculateStrategy) new SubwayStrategy();
        calculateStrategy.calculatePrice(20);
        System.out.println(TAG + "subway  price:" +  calculateStrategy.calculatePrice(20));
    }
}

6) log打印

传入相同参数 但是 显示价格却是不一样的。

在这里插入图片描述

文献参考:
Android 源码设计模式解析与实战 第二版

本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/84343458
今日推荐