【Java 设计模式】策略模式,枚举+工厂方法实现

您所在的位置:网站首页 hg260工厂模式 【Java 设计模式】策略模式,枚举+工厂方法实现

【Java 设计模式】策略模式,枚举+工厂方法实现

2024-07-16 09:01| 来源: 网络整理| 查看: 265

项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改  (代码参照于蚂蚁课堂)

目录

一、什么是策略模式

二、策略模式优缺点

优点:

缺点:

三、枚举+工厂方法实现策略模式code

1.定义共同行为接口

2.具体策略实现类

3.定义枚举,保存策略实现类具体路径

4.策略工厂

5.使用策略工厂获取具体策略实现

一、什么是策略模式

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重If判断问题。

1.环境(Context)角色:持有一个Strategy的引用。

2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

3.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

(定义策略接口→实现不同的策略类→利用多态或其他方式调用策略。)

二、策略模式优缺点 优点:

算法可以自由切换(高层屏蔽算法,角色自由切换)

避免使用多重条件判断(如果算法过多就会出现很多相同的判断,很难维护)

扩展性好(可自由添加取消算法,而不影响整个功能)

缺点:

策略数量增多(每一个策略类复用性小,如果需要增加算法,就只能新增类)

所有的策略类都需要对外暴露(使用的人必须了解使用策略,这个就需要其他模式来补充,比如工厂模式、代理模式)

三、枚举+工厂方法实现策略模式code 1.定义共同行为接口 /** * 共同行为 */ public interface FactApplyStrategy { String toAddFact(); } 2.具体策略实现类 package com.google.DesignPatterns.StrategyPattern.fact.impl; import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy; /** * @author wk * @Description: * @date 2019/12/24 13:59 **/ public class GdFactApplyStrategy implements FactApplyStrategy { @Override public String toAddFact() { return "跳转光大银行"; } } package com.google.DesignPatterns.StrategyPattern.fact.impl; import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy; /** * @author wk * @Description: * @date 2019/12/26 14:51 **/ public class JTFactApplyStrategy implements FactApplyStrategy { @Override public String toAddFact() { return "跳转交通银行"; } } 3.定义枚举,保存策略实现类具体路径 package com.google.DesignPatterns.StrategyPattern.fact; /** * 策略枚举类 */ public enum PurposeEnum { TYPE_1(1, "中国银行", ""), TYPE_2(2, "光大银行", "com.google.DesignPatterns.StrategyPattern.fact.impl.GdFactApplyStrategy"), TYPE_3(3, "交通银行", "com.google.DesignPatterns.StrategyPattern.fact.impl.JTFactApplyStrategy"), ; private Integer code; private String mark; private String className; private PurposeEnum(Integer code, String mark, String className) { this.code = code; this.mark = mark; this.className = className; } public Integer getCode() { return code; } public String getMark() { return mark; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public static PurposeEnum getEnumObjByCode(Integer code) { for (PurposeEnum be : values()) { if (be.getCode().equals(code)) { return be; } } return null; } } 4.策略工厂 package com.google.DesignPatterns.StrategyPattern.fact.factory; import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy; import com.google.DesignPatterns.StrategyPattern.fact.PurposeEnum; /** * @author wk * @Description: * @date 2019/12/24 14:09 **/ public class FactApplyFactory { //使用策略工厂获取具体策略实现 public static FactApplyStrategy getFactApplyStrategy(Integer code) { try { return (FactApplyStrategy) Class.forName(PurposeEnum.getEnumObjByCode(code).getClassName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } } 5.使用策略工厂获取具体策略实现 package com.google.DesignPatterns.StrategyPattern.fact.context; import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy; import com.google.DesignPatterns.StrategyPattern.fact.factory.FactApplyFactory; /** * @author wk * @Description:获取具体策略实现 * @date 2019/12/24 14:03 **/ public class FactContextStrategy { /** * 获取具体的策略实现 * @param code * @return */ public String toAddFact(Integer code) { //使用策略工厂获取具体的策略实现 FactApplyStrategy factApplyStrategy = FactApplyFactory.getFactApplyStrategy(code); if (factApplyStrategy == null) { throw new RuntimeException("没有找到对应的策略实现"); } return factApplyStrategy.toAddFact(); } public static void main(String[] args) { System.out.println(new FactContextStrategy().toAddFact(2)); System.out.println(new FactContextStrategy().toAddFact(3)); } }

输出:

跳转光大银行 跳转交通银行



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3