策略+工厂设计模式

2021-03-01  本文已影响0人  程序员小白成长记

策略+工厂设计模式demo

一、 if/else 写法

通过代码清单一可以看出代码里存在很多的if/else

1.1 代码清单一

package com.example.demo.designPattern;

public class UserTaskNoDesign {
    public static void main(String[] args) {
        UserTaskNoDesign userTaskNoDesign = new UserTaskNoDesign();
        userTaskNoDesign.userTaskPorcess("张三");
    }

    public void userTaskPorcess(String name) {
        if (name.equals("张三")) {
            System.out.println("张三完成任务1");
        } else if (name.equals("李四")) {
            System.out.println("李四完成任务1");
        } else if (name.equals("王五")) {
            System.out.println("王五完成任务1");
        } else if (name.equals("马六")) {
            System.out.println("马六完成任务1");
        }
        // ... ... 更多的else if
    }
}

二、策略模式+工厂模式

【设计目标】
1,代码便于扩展
2,代码便于阅读
3,方法便于调用

一般将if/else逻辑中每个策略(方法)都抽离出来,可抽象成接口,使用多态在运行时决定调用哪一个实现

2.1【解决方案一】

1,定义一个策略接口
2,定义每一种策略类实现改接口

public interface UserTaskStrategy {
    void userTaskPorcess(String name);
}
public class ZhangsanTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("张三完成任务1");
    }
}
public class LisiTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("李四完成任务1");
    }
}
public class WangwuTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("王五完成任务1");
    }
}
public class MaliuTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("马六完成任务1");
    }
}

现在if/else的逻辑都抽离了出来,但是如何根据传入的name调用对应的策略类又是一个问题

2.2【解决方案二】

对应的策略类重写InitializingBeanafterPropertiesSet方法将所有的实现类注册到工厂类的静态成员变量map<String,UserTaskStrategy>中,然后就可以通过工厂类的map通过name取出对应实现类。

public interface UserTaskStrategy extends InitializingBean {
    void userTaskPorcess(String name);
}
@Component
public class ZhangsanTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("张三完成任务1");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UserTaskStrategyFactory.registerUserTaskStrategy("张三", this);
    }
}
@Component
public class LisiTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("李四完成任务1");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UserTaskStrategyFactory.registerUserTaskStrategy("李四", this);
    }
}
@Component
public class WangwuTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("王五完成任务1");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UserTaskStrategyFactory.registerUserTaskStrategy("王五", this);
    }
}
@Component
public class MaliuTaskStrategy implements UserTaskStrategy {

    @Override
    public void userTaskPorcess(String name) {
        System.out.println("马六完成任务1");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UserTaskStrategyFactory.registerUserTaskStrategy("马六", this);
    }
}
public class UserTaskStrategyFactory {

    public static Map<String, UserTaskStrategy> strategyMap = new HashMap<>();

    public static UserTaskStrategy getUserTaskStrategy(String name) {
        return strategyMap.get(name);
    }

    public static void registerUserTaskStrategy(String name, UserTaskStrategy userTaskStrategy) {
        if (StringUtils.isEmpty(name) || userTaskStrategy == null) {
            return;
        }
        strategyMap.put(name, userTaskStrategy);
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserTaskStrategyTest {

    @Test
    public void test() {
        String name = "张三";
        UserTaskStrategyFactory.getUserTaskStrategy(name).userTaskPorcess(name);
    }
}

这样如果有一个新的策略,只需要新建一个策略类实现UserTaskStrategy即可;符合开闭原则。

上一篇 下一篇

猜你喜欢

热点阅读