【行为型模式】策略模式strategy

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【行为型模式】策略模式strategy,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

基本要点

1、定义:策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法

2、本质:分离算法,选择实现

3、举例:我们开了一家手机专卖店,对于不同的客人,我们有不同的报价策略
新客人,小批量购机,我们原价
新客人,大批量购机,我们打9折
老客人,小批量购机,我们打85折
老客人,大批量购机,我们打8折

虽然我们可以通过if/else语句进行处理,但是后续如果还有其他策略,我们就需要修改原代码,不符合我们的开闭原则,所以我们把报价设计成一个接口,对应的报价策略设计成相应的实现类,这样,即使有新的报价策略,我们只需要新增实现类即可,不需要修改原代码

4、使用场景
Spring框架中的resource接口,资源访问策略

代码样例

首先我们需要创建一个接口,后续的策略都通过实现这个接口来增加

/**
 * 抽象策略类(Strategy)
 */
public interface Strategy {
    double getPrice(double standardPrice);
}

/**
 * 新客户小批量策略
 */
public class NewCustomerFewAmount implements Strategy{
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("新客户小批量购机,不打折");
        return standardPrice;
    }
}

/**
 * 新客户大批量策略
 */
public class NewCustomerManyAmount implements Strategy{
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("新客户大批量购机,打九折");
        return standardPrice * 0.9;
    }
}

/**
 * 老客户小批量策略
 */
public class OldCustomerFewAmount implements Strategy{
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("老客户小批量购机,打85折");
        return standardPrice * 0.85;
    }
}

/**
 * 老客户大批量策略
 */
public class OldCustomerManyAmount implements Strategy{
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("老客户大批量购机,打八折");
        return standardPrice * 0.8;
    }
}

此外,我们还需要创建一个上下文类,来实现算法和客户端的分离

/**
 * 上下文类,负责和具体的策略类进行交互
 * 实现了具体算法和客户端调用的分离,使得算法可以独立于客户端独立变化
 * 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同的策略对象
 */
public class Context {
    // 当前采用的算法对象
    private Strategy strategy;

    // 可以通过构造器注入
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    // 可以通过set方法注入
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void printPrice(double price) {
        System.out.println("您的报价为:" + strategy.getPrice(price));
    }
}

最后,我们在客户端进行测试

public class Client {
    public static void main(String[] args) {
    	// 针对不同的客户和订货数量,我们需要采用不同的报价策略
        Strategy strategy = new NewCustomerManyAmount();
        Context context = new Context(strategy);

        context.printPrice(100);
    }
}

实现结果如下
在这里插入图片描述

如有错误,欢迎指正

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136805.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!