利用策略模式代替if else

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用策略模式代替if else相关的知识,希望对你有一定的参考价值。

参考技术A 一个完善的,可维护的,易阅读的系统功能,其核心功能应该是稳定且包容的。

例如玩家中心这样的事情,其功能界面构建和按钮点击逻辑应该是独立于具体业务和实现的。

要做到这样的松耦合度,又要能够实现界面功能。

第一:界面的模块化。

    不管内嵌的是什么活动逻辑和业务,不应该影响页面逻辑层。

    可以把按钮点击事件和所实现的功能以注册的方式加入到页面逻辑内,页面逻辑不可更改。也就是说页面需要加入注册的接口和管理相关的table并妥善的实现刷新逻辑!(刷新逻辑非常重要!)具体来说就是页面逻辑和业务逻辑分离。每一个具体业务的逻辑也要和总的调用逻辑分层,不应该涉及到具体的业务,仅仅只是调用并且加入到页面逻辑里面。

玩家中心包含的页面逻辑:

1.n个大页面的按钮点击和切换。

2.每个大页面中具体的子业务的加入接口,点击事件,删除子业务逻辑,自我刷新页面和整体刷新页面。

业务逻辑调用层逻辑:

1.添加和删除具体业务,并调用子业务中是否存在的方法,来是否注册到页面逻辑中,并把相关的句柄传递给子业务中。

2.开启关闭逻辑,并在此逻辑中加入业务逻辑。

3.子业务必须以注册的方式加到逻辑中的列表中,并在处理相关的调用时直接获取子业务的值,再做相关处理(干掉if-else)

子业务逻辑:

1.需要自己实现是否展现的接口。

2.需要自己实现子业务逻辑界面。

3.可以获取到玩家中心的句柄,并做删除自身的操作,或者关闭玩家中心的操作。

4.任何额外的领奖界面,请不要和玩家中心的逻辑混在一起,包括界面和逻辑!

5.领奖后的处理事件,请自己传递到领奖界面层。

策略模式+工厂模式-解决if else

public interface strategy extends InitializingBean

void handler(JsonObject z2CmdReq);

public class CtrlInnerPolicyStrategy implements strategy

@Override

public void handler(JsonObject z2CmdReq)

//TODO

@Override

public void afterPropertiesSet()

CmdStrategyFactory.register(CmdTypeConstant.CTRL_INNER_POLICY,this);

@Component

public class CmdStrategyFactory

private static Map<String,Strategy> map = new HashMap<>();

public static Strategy getSpecStrategy(String cmd)

return map.get(cmd);

public static void register(String cmd,Strategy handler)

if(StringUtils.isEmpty() &&null == handler)

return;

map.put(cmd,handler);

使用:

CmdStrategyFactory.getSpecStrategy(z2CmdReq.getCmdType()).handler(JsonObject z2CmdReq);

以上是关于利用策略模式代替if else的主要内容,如果未能解决你的问题,请参考以下文章

高效的策略模式设计方法

策略模式+工厂方法消除if...else

python---策略模式

Spring 实现策略模式--自定义注解方式解耦if...else

小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了

Java使用函数式接口处理if-else的策略模式