【设计模式】策略模式

项目实例:

 

不同业务帧数据的处理:

swicth(消息号)

case 请求事件记录:

#处理事件帧数据

break;

case 请求故障列表:

#故障列表帧数据

break;

case 请求用户列表:

#用户列表帧数据

break;

 

前言

今天我来全面总结一下Android开发中最常用的设计模式 -策略模式。

其他设计模式介绍
1分钟全面了解“设计模式”
单例模式(Singleton) - 最易懂的设计模式解析
简单工厂模式(SimpleFactoryPattern)- 最易懂的设计模式解析
工厂方法模式(Factory Method)- 最易懂的设计模式解析
抽象工厂模式(Abstract Factory)- 最易懂的设计模式解析
策略模式(Strategy Pattern)- 最易懂的设计模式解析
适配器模式(Adapter Pattern)- 最易懂的设计模式解析
代理模式(Proxy Pattern)- 最易懂的设计模式解析
模板方法模式(Template Method) - 最易懂的设计模式解析
建造者模式(Builder Pattern)- 最易懂的设计模式解析
外观模式(Facade Pattern) - 最易懂的设计模式解析


目录

策略模式.jpg


1. 介绍

1.1 定义

定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换 & 让算法可在不影响客户端的情况下发生变化

简单来说:准备一组算法 & 将每一个算法封装起来,让外部按需调用 & 使得互换

1.2 作用(解决的问题)

将算法的责任和本身进行解耦,使得:

  1. 算法可独立于使用外部而变化
  2. 客户端方便根据外部条件选择不同策略来解决不同问题

策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定


2. 模式原理

2.1 UML类图 & 组成

UML类图

2.2 实例讲解

接下来我用一个实例来对策略模式进行更深一步的介绍。
a. 实例概况

  • 背景:小成有一家百货公司,最近在定年度的促销活动
  • 冲突:每个节日用同一个促销活动太枯燥,没吸引力
  • 解决方案:针对不同节目使用不同促销活动进行促销

b. 使用步骤
步骤1: 定义抽象策略角色(Strategy):百货公司所有促销活动的共同接口


public abstract class Strategy {  

    public abstract void Show();
}

步骤2:定义具体策略角色(Concrete Strategy):每个节日具体的促销活动

//为春节准备的促销活动A
class StrategyA extends Strategy{

    @Override
    public void show() {
        System.out.println("为春节准备的促销活动A");
    }
}

//为中秋节准备的促销活动B
class StrategyB extends Strategy{

    @Override
    public void show() {
        System.out.println("为中秋节准备的促销活动B");
    }
}

//为圣诞节准备的促销活动C
class StrategyC extends Strategy{

    @Override
    public void show() {
        System.out.println("为圣诞节准备的促销活动C");
    }
}

步骤3:定义环境角色(Context):用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员

class Context_SalesMan{
//持有抽象策略角色的引用
    private Strategy strategy;

    //生成销售员实例时告诉销售员什么节日(构造方法)
    //使得让销售员根据传入的参数(节日)选择促销活动(这里使用一个简单的工厂模式)
    public SalesMan(String festival) {
        switch ( festival) {
            //春节就使用春节促销活动
            case "A":
                strategy = new StrategyA();
                break;
            //中秋节就使用中秋节促销活动
            case "B":
                strategy = new StrategyB();
                break;
            //圣诞节就使用圣诞节促销活动
            case "C":
                strategy = new StrategyC();
                break;
        }

    }

    //向客户展示促销活动
    public void SalesManShow(){
        strategy.show();
    }

}

步骤4:客户端调用-让销售员进行促销活动的落地


public class StrategyPattern{
  public static void main(String[] args){

        Context_SalesMan mSalesMan ;

        //春节来了,使用春节促销活动
        System.out.println("对于春节:");
        mSalesMan =  Context_SalesMan SalesMan("A");
        mSalesMan.SalesManShow();
        
        
        //中秋节来了,使用中秋节促销活动
        System.out.println("对于中秋节:");
        mSalesMan =  Context_SalesMan SalesMan("B");
        mSalesMan.SalesManShow();

        //圣诞节来了,使用圣诞节促销活动
        System.out.println("对于圣诞节:");
        mSalesMan =  Context_SalesMan SalesMan("C");
        mSalesMan.SalesManShow();  
  }   
}
   

结果输出

对于春节:
为春节准备的促销活动A
对于中秋节:
为中秋节准备的促销活动B
对于圣诞节:
为圣诞节准备的促销活动B

通过上述这个常见的生活例子,我相信你已经完全明白了策略模式的原理了!!


3. 优缺点

在全面解析完后,我来分析下其优缺点:

3.1 优点

  • 策略类之间可以自由切换
    由于策略类都实现同一个接口,所以使它们之间可以自由切换。
  • 易于扩展
    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“
  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

3.2 缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

4. 应用场景

动态选择多种复杂行为

该行为可理解为:

  1. 复杂的算法 / 数据结构
  2. 类的行为 / 方法
    注:提高了行为的保密 & 阿暖

5. 总结

本文主要对策略模式进行了全面介绍,接下来将介绍其他设计模式,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!!!



作者:Carson_Ho
链接:https://www.jianshu.com/p/0c62bf587b9c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


 

 

策略模式是一种设计模式,它在JavaScript中有着广泛的应用。策略模式的主要思想是将不同的算法封装成不同的策略类,并让这些策略类能够互相替换,以实现不同的行为。在JavaScript中,策略类就是一组函数,它们可以根据不同的情况来执行不同的算法。 策略模式在JavaScript中有很多实际运用,其中两个主要的应用场景是实现动画效果和表单验证。通过使用策略模式,我们可以轻松地切换不同的动画效果,同时可以根据不同的验证规则来验证表单数据的有效性。 在实际的开发过程中,策略模式的应用可能会受到需求的限制,因此在一些情况下这类需求较少。然而,理解策略模式的实现原理是非常重要的,包括封装、委托、多态等概念在策略模式中的应用。这些概念是策略模式的核心。 总结来说,策略模式是一种在JavaScript中广泛应用的设计模式,它通过将算法封装成不同的策略类,实现了行为的灵活替换。在实际应用中,策略模式可以用于实现动画效果和表单验证等功能。理解策略模式的核心概念对于深入理解JavaScript中的设计模式是非常重要的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [05 【JavaScript设计模式策略模式](https://blog.csdn.net/qq_35117024/article/details/106396011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [js设计模式策略模式](https://blog.csdn.net/SK_study/article/details/122404194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值