首页 > 其他分享 >Android 策略模式 接口的调用

Android 策略模式 接口的调用

时间:2023-11-24 11:04:32浏览次数:30  
标签:调用 策略 int km CalculateStrategy TAG 接口 收费 Android



文章目录

  • 1、策略模式介绍
  • 2、使用场景
  • 3、UML 类图
  • 4、策略模式的简单实现
  • 1)文件结构
  • 2)CalculateStrategy 接口文件
  • 3)BusStrategy 公交收费策略
  • 4)地铁收费策略
  • 5)MainActivity 调用不同 收费策略
  • 6) log打印


1、策略模式介绍

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

2、使用场景

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

3、UML 类图

Android  策略模式  接口的调用_System

4、策略模式的简单实现

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

1)文件结构

Android  策略模式  接口的调用_策略模式_02


(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  策略模式  接口的调用_策略模式_03

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

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


标签:调用,策略,int,km,CalculateStrategy,TAG,接口,收费,Android
From: https://blog.51cto.com/u_15866638/8546113

相关文章

  • Android widget简介及demo
    文章目录1、简介2、文件结构3、res->xml->appwidget_info.xml4、main_activity.xml5、AndroidManifest.xml6、MyWidget.java7、WidgetService.java8、MainActivity.java1、简介实现桌面小部件2、文件结构1)appwidget_info.xml定义了widget一些属性2)AndroidManifest.xml定义w......
  • Android 动态申请 权限 permission
    文章目录1、单个权限动态申请1)文件结构2)在AndroidManifest.xml添加权限3)在代码里进行权限检查和申请2、多个权限动态申请1)在AndroidManifest.xml添加权限2)、CheckPermission文件3)在MainActivity文件里面调用CheckPermission1、单个权限动态申请以SD卡读写权限......
  • Android典型技术模块开发详解 pdf 资料
    文章目录1、介绍2、章节介绍1、介绍Android典型技术模块开发详解适合刚步入Android开发的工作者,对于Android各个模块能够很好、很全面的讲解。2、章节介绍Android典型技术模块开发详解pdfAndroid典型技术模块开发详解代码文献参考:《Android典型技术模块开发详解》......
  • Android MVC 模式的介绍 与 实战
    文章目录1、mvc框架图2、MVC在Android模式里的实现4、小结1、mvc框架图经典的mvc模式如图所示1)Model(模型层)在MVC中Model一般用来保存数据的状态,比如数据存储,网络请求。同时还与View存在一定的耦合,通过某种事件机制(比如观察者模式)通知View状态的改变来让view更......
  • Android 抽象工厂模式
    文章目录1、抽象工厂模式介绍2、抽象工厂模式的定义3、抽象工厂模式的使用场景4、抽象工厂模式的简单实现5、小结1、抽象工厂模式介绍抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现。2、抽象工厂模......
  • Android 工厂方法模式
    文章目录1、工厂方法模式介绍2、工厂方法模式的定义3、使用场景4、模式的简单实现1、工厂方法模式介绍工厂方法模式(FactoryPattern),是创建型设计模式之一。工厂方法模式是一个结构比较简单的模式。2、工厂方法模式的定义就是一个用于创建对象的接口,让子类来决定实体化那个类。3......
  • Android 单例模式
    文章目录1、单例模式介绍2、单例模式的简单例子3、懒汉模式实现单例模式4、DoubleCheckLock(DLC)实现单例5、静态内部类单例模式6、枚举单例7、使用容器是实现单例模式1、单例模式介绍据说在一个app中,单例对象的类必须保证只有一个实例存在,系统只有一个全局变量存在。2、单......
  • Java 远程调用连接本地ElasticSearch服务并进行操作
    简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地ElasticsearchCpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的安全性,这为用户和团队提供了更可靠的保护,使他们能够放心地处理和存储敏感的工作内容。 1.Windows安......
  • 远程服务调用(上):从本地方法到远程方法的桥梁
    在原始分布式时代的初期确实是奔着这个目标去做的,但这种透明的调用形式反而让程序员们误以为通信是无成本的,从而被滥用,以至于显著降低了分布式系统的性能。当“透明的RPC调用”一度成为主流范式的时候,安德鲁 · 塔能鲍姆(Andrew Tanenbaum)教授曾发表了一篇论文“A Critique o......
  • eclipse查看一个方法被谁引用(调用)的快捷键四种方式
    1.(首推)双击选中该方法,Ctrl+Alt+H如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ctrl+Alt+H”,Eclipse就会显示出这个方法被哪些方法调用,最终产生一个调用关系树。2.(次推)选中该方法,Ctrl+Shift+G就显示这个方法被谁引用了,查询在整个工作区中被谁......