首页 > 其他分享 >设计模式之策略模式

设计模式之策略模式

时间:2022-10-13 13:11:04浏览次数:45  
标签:... String 模式 else doOperation 设计模式 public 策略

概述

策略模式(Strategy Pattern)的思想是在程序运行时动态改变某一个类的执行逻辑,属于一种行为型设计模式。目的是为了尽可能的减少if...else代码。它的核心在于”选择“两个字,每一种选择就是一个策略。通常情况下,在选择不多的时候,我们采用的是if...else代码块来实现。但是这种方式的扩展性不强,每次增加一种选择就需要修改该if...else的源码,违反了开闭原则。况且一旦if...else多了起来可读性也会变差。所以在开发中遇到”多种选择“时,可以优先考虑一下策略模式。

使用场景

  1. 如:中午吃什么?米饭,面,粉等等,每一个选择就是一种策略
  2. 旅游出行时,选择什么样的交通工具。飞机、高铁、地铁

如何实现

  1. 所有的策略实现类有一个顶层接口Strategy,接口中定义了一个执行逻辑方法
  2. 策略实现类实现Strategy接口,编写自己的执行逻辑
  3. 维护一个Context类,这个类的执行逻辑是可变的,每当它的策略发生改变时,其运行结果也会发生改变

代码示例

策略接口及实现类

public interface TravelStrategy {
    String doOperation();
}
public class Airplane implements TravelStrategy {
    @Override
    public String doOperation() {
        return "飞机";
    }
}
public class HighSpeedRail implements TravelStrategy {
    @Override
    public String doOperation() {
        return "高铁";
    }
}
public class Subway implements TravelStrategy {
    @Override
    public String doOperation() {
        return "地铁";
    }
}

可动态改变执行策略的类

public class MyTravelContext {
    public String executeStrategy(TravelStrategy travelStrategy) {
        return "出门旅游坐啥好: " + travelStrategy.doOperation();
    }
}

测试

public class TestStrategy {
    public static void main(String[] args) {
        MyTravelContext context = new MyTravelContext();

        System.out.println(context.executeStrategy(new Airplane()));
        System.out.println(context.executeStrategy(new HighSpeedRail()));
        System.out.println(context.executeStrategy(new Subway()));
    }
}

运行结果

出门旅游坐啥好: 飞机
出门旅游坐啥好: 高铁
出门旅游坐啥好: 地铁

框架源码中的应用

  1. spring框架中的ObjectNamingStrategy类,获取bean的beanName

总结

优点

  1. 扩展性好
  2. 运行时自由切换执行逻辑
  3. 减少if...else代码

缺点

  1. 策略过多时会产生大量的类
  2. 所有策略类都需要暴露给使用者

标签:...,String,模式,else,doOperation,设计模式,public,策略
From: https://www.cnblogs.com/yywf/p/16787519.html

相关文章

  • ubuntu 16.04 进入单机模式
    进入单用户模式进入grub菜单之后,进入ubuntu高级选项,光标停留在第二行,"recoverymode"的一行,按“e”进行编辑,找到“Linux”那一行,linux/boot/vmlinuz-----\***rorecover......
  • 适配器模式
    实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。  publicclassClient{publicstaticvoidmain(String[]args){Adapteradapter=newA......
  • 搭建Hadoop伪分布模式环境实验
    我使用的是Finalshell,不是Xshell,各位可以参考一下1.首先,开启虚拟机,等待连接成功,输入"start-all.sh"启动HDFS,Yarn,然后输入jps查看进程是否正常2.打开HDFSWeb界面,在本地......
  • 关于不同层次消费者的文化产品市场策略
    对于顶层社会,文化在于向奢侈化方向发展,使其具备标杆效应。纵观古今中外,撇开道德的褒贬,文化的极致都是在顶层社会沉淀,奢侈从来都是积极的推手。顶层社会的消费力意味着文化......
  • 采购申请审批策略增强
    一般而言审批策略特征类创建时,特征项都是从CEBAN和CEKKO两个结构里取值。但是有时候,审批策略控制过程中,需要其他非以上两结构中字段,比如PS那边创建的采......
  • [转载]SAPMM采购申请审批策略配置‘挖坑埋坑之ItemCategory
    作者:​​嘻嘻哈哈​​SAPMM采购申请审批策略配置‘挖坑埋坑'之ItemCategory 在后台配置中,我们可以启用classification来实现采购申请的审批策略。我们可以将PR中......
  • Unity泛型单例模式
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassSingleton<T>:MonoBehaviourwhereT:Singleton<T......
  • 【GAN优化】解决模式崩溃的两条思路:改进优化和网络架构
    今天讲述的内容仍然是GAN中的模式崩溃问题,首先将说明模式崩溃问题的本质,并介绍两种解决模式崩溃问题的思路,然后将介绍一种简单而有效的解决方案MAD-GAN,最后一部分将给出MAD-......
  • 设计模式进阶
    1.请列举出在JDK中几个常用的设计模式?单例模式(Singletonpattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factorypattern)被用于各种不可变的类如Boolean,像Boo......
  • 构造者模式(建造者)
    构造者模式的定义      是指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。通俗的说,......