如何使用工厂加策略模式干掉一大堆的if-else判断?

工厂模式

工厂模式中每个工厂只生成一种具体产品,工厂模式里面分为四个角色

  • 抽象工厂用于定义一个抽象的工厂方法,比如说创建产品;
  • 抽象产品,定义产品的接口;
  • 具体工厂实现抽象工厂的方法,用于创建具体的产品;
  • 具体产品实现了抽象产品,是工厂创建的对象。用生活中的例子来说,

手机是一个抽象产品,手机制造厂是一个抽象工厂,华为手机是一个具体的产品,华为手机工厂是具体的工厂,华为手机工厂只生产华为手机不会生产别的手机。

策略模式

策略模式的定义是定义一组算法,将每个算法封装起来,通过上下文使他们可以进行切换,策略模式让算法独立于根据使用他的客户变化而变化。
策略模式关注到具体的行为上。策略模式里面包含三个结构:

  • 有策略接口,定义所有支持的算法接口;
  • 具体策略类,实现接口的具体算法;
  • 上下文类,包含一个策略实例,用于调用具体的策略。

举个生活中的例子就是:洗衣机,洗衣机里面包含了不同的功能,有标准,快洗,脱水等等功能,这一个个功能就相当于不同的策略,通过洗衣机控制面板来调用不同的功能也就是不同的策略。

实际应用

以制造手机为例子
可以先实现一个策略接口

public interface PhoneTypeHandler {
    PhoneTypeEnum getPhoneTypeEnum();

    void create();

    void back();
}

然后有两个策略实现类

@Component
public class XiaomiPhoneTypeHandler implements PhoneTypeHandler {

    @Override
    public PhoneTypeEnum getPhoneTypeEnum() {
        return PhoneTypeEnum.Xiaomi;
    }

    @Override
    public void create() {
        System.out.println("制造小米手机");
    }

    @Override
    public void back() {
        System.out.println("返厂小米手机");
    }
}

@Component
public class HuaweiPhoneTypeHandler implements PhoneTypeHandler{

    @Override
    public PhoneTypeEnum getPhoneTypeEnum() {
        return null;
    }

    @Override
    public void create() {
        System.out.println("制造华为手机");
    }

    @Override
    public void back() {
        System.out.println("返厂华为手机");
    }
}

定义一个枚举用于实现调用具体的策略

public enum PhoneTypeEnum {

    Xiaomi(1,"小米手机"),
    Huawei(2,"华为手机");
    int code;
    String desc;

    PhoneTypeEnum(int code,String desc){
        this.code = code;
        this.desc = desc;
    }

    public static PhoneTypeEnum getPhone(int code){
        for (PhoneTypeEnum phoneTypeEnum : PhoneTypeEnum.values()){
            if (phoneTypeEnum.code == code){
                return phoneTypeEnum;
            }
        }
        return null;
    }
}

最后我们可以实现一个工厂类,将他们这些策略创建出来

public class PhoneHandlerFactory implements InitializingBean {

    //将策略类自动的注入进list里面
    @Resource
    List<PhoneTypeHandler> phoneTypeHandlers = new ArrayList<>();

    //相当于策略模式中的上下文用于管理和调度
    HashMap<PhoneTypeEnum,PhoneTypeHandler> map = new HashMap();

    //供外界调用策略
    public PhoneTypeHandler getPhoneTypeHandler(int code){
        PhoneTypeEnum phoneTypeEnum = PhoneTypeEnum.getPhone(code);
        return map.get(phoneTypeEnum);
    }

    //凡是继承InitializingBean接口的类,在初始化bean的时候都会执行该方法
    @Override
    public void afterPropertiesSet() throws Exception {
        //将代码和策略结合起来
        for (PhoneTypeHandler phoneTypeHandler : phoneTypeHandlers){
            map.put(phoneTypeHandler.getPhoneTypeEnum(),phoneTypeHandler);
        }
    }
}

你可能感兴趣的:(策略模式)