T31-DAY28(策略模式+单例模式+工厂模式实战)

29 篇文章 1 订阅

这次我们拿购物举例子。我们知道不同的身份会对应不同的折扣。比如普通用户不打折,会员打五折。

这样就会有一个打折策略

public interface DiscountStrategy {

    Integer discount(Integer price);
}

另外,不同的用户我们这里用枚举类来表示

public enum UserEnum {
    /**
     * 普通用户
     */
    USER("USER","com.example.demo.strategyDemo.User"),
    /**
     * 会员
     */
    MEMBER("MEMBER","com.example.demo.strategyDemo.Member");

    String type;
    String clazz;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }

    UserEnum(String type, String clazz) {
        this.type = type;
        this.clazz = clazz;
    }

    public static Map<String,String> getAllClazz() {
        Map<String,String> map = new HashMap();
        for (UserEnum e : UserEnum.values()) {
            map.put(e.getType(), e.getClazz());

        }
        return map;
    }

}

这样写好之后,我们分别实现普通用户和会员用户的打折策略,同时,使用饿汉模式创建对象。
普通用户不打折

public class User implements DiscountStrategy {

  private static final User INSTANCE=new User();
  
  public static User getInstance(){
      return INSTANCE;
  }
    @Override
    public Integer discount(Integer price) {
        return price;
    }
}

会员打五折

public class Member  implements DiscountStrategy {
    private static final Member  INSTANCE = new Member ();

    public static Member  getInstance() {
        return INSTANCE;
    }
    @Override
    public Integer discount(Integer price) {
        return price>>1;
    }
}

现在方法都实现了。我们需要将特么串起来。不同的用户对应不同的折扣。我们用工厂去创建对象。

public class Factory {
    public static DiscountStrategy getInstance(UserEnum userType){
        Map<String,String> allType=UserEnum.getAllClazz();
        String clazz = allType.get(Optional.ofNullable(userType.toString()).orElse(UserEnum.USER.type));
        DiscountStrategy strategy = null;
        try {
            Class<?> c= Class.forName(clazz);
            //使用getInstance方法获取单例对象
            Method m = c.getDeclaredMethod("getInstance");
            strategy = (DiscountStrategy) m.invoke(null);
        } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
         e.printStackTrace();
        }
        return strategy;
    }
}

这里需要每个类都有一个getInstance方法才能通过单例模式获取对象。避免了对象的频繁创建。想知道对象是否只创建了一次可以在类的无参构造方法里面打印内容。

写个测试用例试试

    @Test
    public void discount(){
        Integer price=100;
        DiscountStrategy userStrategy= Factory.getInstance(UserEnum.USER);
        DiscountStrategy memberStrategy= Factory.getInstance(UserEnum.MEMBER);
        System.out.println("普通用户的价格:"+userStrategy.discount(price));
        System.out.println("会员用户的价格:"+memberStrategy.discount(price));

    }

输出:
在这里插入图片描述
使用策略模式可以避免代码里面大量出现if else。你学会了吗?快拿去装逼。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值