详解Java策略模式

详解Java策略模式

一、策略模式到底是什么?

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

简单的说,策略模式代表了一类算法的通用解决方案,你可以在运行时选择使用哪种解决方案。

策略模式的重心

策略模式的重心不是如何实现算法, 而是如何组织、调用这些算法, 从而使得程序结构更加灵活,具有更好的维护性和扩展性。

算法的平等性

策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,地位都是一样的,因此可以实现算法之间可以互相替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

运行时策略的唯一性

运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

公有的行为

经常见到的是,所有的具体策略都有一些公有的行为。这时候,就应该把这些公有的行为放到共同的抽象策略角色

Strategy类里面。这时不能使用接口,应该使用抽象类来实现。

二、策略模式的结构

策略模式包含三部分内容:(如下图所示)

三、策略模式的应用

四、策略模式Demo

假设现在需要根据业务的需求,对调用接口传进来的参数,选择合适的策略进行处理,这里假设有策略一和策略二。

Client:

/**
 * @author lyh
 * @version v-1.0.0
 * @since 2021/6/2
 */
public class Client {
    public static void main(String[] args) {
        //根据需要客户自行选择策略
        //加入Java开发交流君样:756584822一起吹水聊天
        //选择策略1
        StrategyObj strategyOne = new StrategyObj(new StrategyOne());
        System.out.println(strategyOne.strategy("one"));
        //选择策略2
        StrategyObj strategyTwo = new StrategyObj(new StrategyTwo());
        System.out.println(strategyTwo.strategy("two"));
    }
}

输出:
执行策略1!
执行策略2!

Process finished with exit code 0

策略接口:

/**
 * @desc:策略接口
 */
public interface Strategy {
    String execute(String s);
}

/**
 * @desc:策略接口封装
 */
public class StrategyObj {

    private final Strategy strategy;

    public StrategyObj(Strategy v) {
        this.strategy = v;
    }

    public String strategy(String s) {
        return strategy.execute(s);
    }//加入Java开发交流君样:756584822一起吹水聊天

}

策略实现:

/**
 * @desc:策略一
 */
public class StrategyOne implements Strategy {
    @Override
    public String execute(String s) {
        return "执行策略1!";
    }
}

/**
 * @desc:策略二
 */
public class StrategyTwo implements Strategy {
    @Override
    public String execute(String s) {
        return "执行策略2!";
    }
}

五、使用Lambda表达式

通过上面的demo应该可以意识到Strategy是一个函数式接口;除此之外,它还与Predicate<String>具有同样的函数描述。这意味着我们不需要声明新的类来实现不同的策略,通过直接传递Lambda表达式就能达到同样的目的且更简洁。

public class Client {
    public static void main(String[] args) {
        StrategyObj strategyOne = new StrategyObj((String s) -> {return "执行策略1";});
        System.out.println(strategyOne.strategy("one"));
         //加入Java开发交流君样:756584822一起吹水聊天
        StrategyObj strategyTwo = new StrategyObj((String s) -> {return "执行策略2";});
        System.out.println(strategyTwo.strategy("two"));
    }
}

Lambda表达式避免了采用策略设计模板时僵化的模板代码。仔细看上面的代码会发现,Lambda表达式实际已经对策略进行了封装, 这就是创建策略设计模式的初衷.

六、策略模式的优缺点

优点

缺点

到此这篇关于详解Java策略模式的文章就介绍到这了,更多相关Java策略模式内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

发布于 2021-06-21 22:06:32
收藏
分享
海报
0 条评论
170
上一篇:MySQL如何使用使用Xtrabackup进行备份和恢复 下一篇:Mybatis中多个对象包含同一个对象的处理操作
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码