Java设计模式之策略模式详细解析

 更新时间:2023年11月30日 10:14:55   作者:啊几  
这篇文章主要介绍了Java设计模式之策略模式详细解析,策略模式中,定义算法族,分别封装起来,让他们之间可以相互转化,此模式让算法的变化独立于使用算法的客户,需要的朋友可以参考下

策略模式基本介绍

策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以相互转化,此模式让算法的变化独立于使用算法的客户。

算法体现的设计原则:

  • 把变化的代码从不变的代码中分离出来
  • 针对接口编程而不是具体类(定义了策略接口)
  • 多用组合/聚合,少用继承(通过使用组合方式使用策略模式)

策略模式实例

例如一个支付折扣服务,根据会员的不同等级进行不同的折扣,初级会员打9折,中级会员打8折,高级会员打7折

会员接口

public interface Member {

    public void discount();
}

三个不同等级会员实现类

public class JuniorMember implements Member{
    @Override
    public void discount() {
        System.out.println("初级会员打9折");
    }
}
public class AssociateMember implements Member{
    @Override
    public void discount() {
        System.out.println("中级会员打8折");
    }
}
public class SeniorMember implements Member{
    @Override
    public void discount() {
        System.out.println("高级会员打7折");
    }
}

传统模式

折扣服务类

public class DiscountService {
    Member member;
    public void payment(MemberType memberType){
        if(memberType==MemberType.JUNIOR){
            member = new JuniorMember();
            member.discount();
        }else if(memberType==MemberType.ASSOCIATE){
            member = new AssociateMember();
            member.discount();
        } else if (memberType==MemberType.SENIOR) {
            member = new SeniorMember();
            member.discount();
        }
    }
}

enum MemberType{
    ASSOCIATE,
    JUNIOR,
    SENIOR
}

客户端类

public class Client {
    public static void main(String[] args){
        DiscountService discountService = new DiscountService();
        System.out.println("--------------使用传统模式--------------");
        discountService.payment(MemberType.SENIOR);
        discountService.payment(MemberType.ASSOCIATE);
        discountService.payment(MemberType.JUNIOR);
    }
}
/**
 * --------------使用传统模式--------------
 * 高级会员打7折
 * 中级会员打8折
 * 初级会员打9折
 */

虽然可以用if else 满足需求,但是不满足开闭原则(对扩展开放,对修改关闭),如果新增会员类型,或者下架原有会员类型,要对折扣服务类进行修改,扩展性很差。可见传统模式弊端十分大。

策略模式

折扣服务类

public class DiscountService {
    Member member;

    DiscountService(Member member){
        this.member = member;
    }

    public void setMember(Member member) {
        this.member = member;
    }

    public void payment(){
        member.discount();
    }
}

客户端类

public class Client {
    public static void main(String[] args) {
        System.out.println("------------使用策略模式------------");
        DiscountService discountService = new DiscountService(new JuniorMember());
        discountService.payment();
        discountService.setMember(new AssociateMember());
        discountService.payment();
        discountService.setMember(new SeniorMember());
        discountService.payment();
    }
}
/**
 * ------------使用策略模式------------
 * 初级会员打9折
 * 中级会员打8折
 * 高级会员打7折
 */

这里将Menber策略接口作为参数组合到折扣服务类,不需要写复杂的 if else,满足开闭原则,增加新的会员类,折扣服务类也不需要修改,并且对其他会员折扣的业务逻辑不会造成影响

JDK中使用策略模式的例子

在JDK中Arrays类中,sort(T[] a, Comparator<? super T> c)方法就是使用了策略模式,Comparator就是一个策略接口,方法中传入了一个具体的排序策略实现类,根据不同的排序策略,进行不同方式的排序

在这里插入图片描述

使用场景

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  • 一个系统需要动态地在几种算法中选择一种。
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

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

相关文章

  • JavaWeb开发入门第一篇必备知识讲解

    JavaWeb开发入门第一篇必备知识讲解

    JavaWeb开发入门第一篇主要内容介绍的是必备知识、基础知识、搭建JavaWeb应用开发环境,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Java Mail与Apache Mail发送邮件示例

    Java Mail与Apache Mail发送邮件示例

    这篇文章主要介绍了Java Mail与Apache Mail发送邮件示例的相关资料,需要的朋友可以参考下
    2014-10-10
  • Java多线程中的CountDownLatch解析

    Java多线程中的CountDownLatch解析

    这篇文章主要介绍了Java多线程中的CountDownLatch解析,CountDownLatch是一个阻塞部分线程直到其他线程执行完成后唤醒的同步计数器,核心是其内部类Sync继承于AQS,同时也是利用的AQS的同步原理,也称之为闭锁,需要的朋友可以参考下
    2023-11-11
  • java中的移位运算符心得总结

    java中的移位运算符心得总结

    这篇文章介绍了java中的移位运算符,有需要的朋友可以参考一下
    2013-11-11
  • Java网络IO模型详解(BIO、NIO、AIO)

    Java网络IO模型详解(BIO、NIO、AIO)

    Java支持BIO、NIO和AIO三种网络IO模型,BIO是同步阻塞模型,适用于连接数较少的场景,NIO是同步非阻塞模型,适用于处理多个连接,支持自JDK1.4起,AIO是异步非阻塞模型,适用于异步操作多的场景,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Struts2.5版本struts.xml与web.xml配置的更改方法

    Struts2.5版本struts.xml与web.xml配置的更改方法

    这篇文章主要给大家介绍了关于Struts2.5版本中struts.xm与web.xml配置的更改方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 关于java的九个预定义Class对象

    关于java的九个预定义Class对象

    这篇文章主要介绍了关于java的九个预定义Class对象,在Java中,没有类就无法做任何事情。然而,并不是所有的类都具有面向对象特征。如Math.random,并只需要知道方法名和参数,需要的朋友可以参考下
    2023-05-05
  • java+vue实现添加单选题、多选题到题库功能

    java+vue实现添加单选题、多选题到题库功能

    这篇文章主要为大家详细介绍了java+vue实现添加单选题、多选题到题库功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 深入解析Spring中的立即加载和延迟加载

    深入解析Spring中的立即加载和延迟加载

    本文介绍了Spring框架中的立即加载和延迟加载策略,并解释了它们的适用场景和使用方法,根据具体的需求和应用场景,选择合适的加载策略,可以提高应用程序的性能和资源利用效率,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • springboot集成RocketMQ过程及使用示例详解

    springboot集成RocketMQ过程及使用示例详解

    这篇文章主要为大家介绍了springboot集成RocketMQ过程及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论