设计模式之策略模式

薄洪涛4年前JAVA988

在开始之前,我们先看一下一个令人不爽的写法

if ($k == 0) {
  // do something
} else if ($k == 1) {
  // do somethings
} else if ($k == 2) {
  // do somethings
}...

重 复的if else,多low哦

针对于if else 无作为的使用以及滥用的吐槽,if …else if … else…这确实是我们在各种项目研发中的一个利器,但是一旦他过于多,就会使逻辑混乱,让代码的可读性大大下降

策略模式的介绍

引入百科的解释:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

策略模式:顾名思义就是当要在不同的情况下做出该情况下所适用的策略,按照面向对象的是思想就是,就使用继承和多态机制,实现同一行为在不同场景下具备不同实现。

策略模式的本质:分离算法,选择实现。

主要解决

从上述的策略模式的本质中的选择实现是不是可以联想到if…else if… else…没错,在有多种算法相似的情况下,使用 if…else 或 switch…case 所带来的复杂性和臃肿性。

直接上代码

/**
 * 策略模式
 * 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
 * 策略模式的主要优点如下。
 * 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if...else 语句、switch...case 语句。
 * 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
 * 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
 * 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
 * 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
 */

interface FlyBehavior {
    public void fly();
}

class FlyWithWind implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("fly with wings");
    }

}

class FlyWithEngind implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("fly with engine");
    }
}

class Airport {
    private FlyBehavior flyBehavior;
    public void setBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    public void fly() {
        this.flyBehavior.fly();
    }
}

class Chicken {
    private FlyBehavior flyBehavior;
    public void setBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    public void fly() {
        this.flyBehavior.fly();
    }
}

class StrategtModel {
    public static void main(String[] args) {
        Airport airport = new Airport();
        airport.setBehavior(new FlyWithEngind());
        airport.fly();

        Chicken chicken = new Chicken();
        chicken.setBehavior(new FlyWithWind());
        chicken.fly();
    }
}

简单说,就是使用依赖注入,挂载不同的对象,由客户端判断什么时候该用什么对象来采用不同的逻辑

消除了那些if…else的冗余代码,取而代之是直接由客户端决定使用哪种算法,然后交由上下文获取结果。增强的了扩展性,隐藏了内部实现的细节

标签: 策略模式

相关文章

springboot实现定时任务

springboot实现定时任务

之前做php的时候,如果想做个定时任务,或者想特定时间调用某个脚本/接口,我们都会考虑使用linux的crontab来实现,比较对于单线程脚本语言来说,做定时不是那么容易然后最近因为开始学习java,...

centos安装java环境

centos安装java环境

很多工具(比如Lucene )都要依赖java环境,所以我在服务器上装了一个jdk,然后在这篇文章中记录下安装的步骤;当我们修改程序并通过SVN上传到服务器后环境:  &...

RabbitMq交换机类型

RabbitMq交换机类型

direct路由键和队列名完全匹配,才可以消费如果绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列fanout还有一种不需要key的,...

接口熔断器resilience4j的使用

pom引入<!-- 熔断器 : https://mvnrepository.com/artifact/io.github.resilience4j/resilien...

Ebean报错is not enhanced?

Ebean报错is not enhanced?

使用ebean的时候,会提示某个类没有enhanced,这里我们在idea中安装对应的plugin就可以了(需要看你的gradle的ebean版本)我的版本配置如下classpath("io...

redis缓存雪崩,缓存击穿,缓存穿透

redis缓存雪崩,缓存击穿,缓存穿透

缓存雪崩同一时间大量redis缓存数据失效,造成大量请求涌入数据库,数据库压力增大崩掉解决方案缓存过期时间加随机值增加过期表示,缓存过期后,自动更新缓存缓存穿透缓存和数据库中都没有的数据,每次查询都会...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。