这次我们拿购物举例子。我们知道不同的身份会对应不同的折扣。比如普通用户不打折,会员打五折。
这样就会有一个打折策略
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。你学会了吗?快拿去装逼。