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策略模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解Java8与Runtime.getRuntime().availableProcessors()
这篇文章主要介绍了详解Java8与Runtime.getRuntime().availableProcessors(),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06使用jekins自动构建部署java maven项目的方法步骤
这篇文章主要介绍了使用jekins自动构建部署java maven项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-01-01java读取配置文件(properties)的时候,unicode码转utf-8方式
这篇文章主要介绍了java读取配置文件(properties)的时候,unicode码转utf-8方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-02-02
最新评论