-
充血枚举类型——Rich Enum Type 模式的优势:
-
不难发现,这其实就是 enum 枚举类型和 Strategy Pattern 策略模式的巧妙结合运用;
-
当需要增加新的通知方式时,只需在枚举类 NOTIFY_TYPE 增加一个值,同时在策略接口 NotifyMechanismInterface 中增加一个 by 方法返回对应的策略实现;
-
当需要修改某个通知机制的实现细节,只需修改 NotifyMechanismInterface 中对应的策略实现;
-
无论新增还是修改通知机制,调用方完全不受影响,仍然是 NOTIFY_TYPE.valueof(type).getNotifyMechanism().doNotify(msg);
-
-
与传统 Strategy Pattern 策略模式的比较优势:常见的策略模式也能消灭 if else 判断,但是实现起来比较麻烦,需要开发更多的 class 和代码量:
-
每个策略实现需单独定义成一个 class;
-
还需要一个 Context 类来做初始化——用 Map 把类型与对应的策略实现做映射;
-
使用时从 Context 获取具体的策略
-
enum NOTIFY_TYPE { //1、定义一个包含通知实现机制的“充血”的枚举类型
email("邮件",NotifyMechanismInterface.byEmail()),
sms("短信",NotifyMechanismInterface.bySms()),
wechat("微信",NotifyMechanismInterface.byWechat());
String memo;
NotifyMechanismInterface notifyMechanism;
private NOTIFY_TYPE(String memo,NotifyMechanismInterface notifyMechanism){//2、私有构造函数,用于初始化枚举值
this.memo=memo;
this.notifyMechanism=notifyMechanism;
}
//getters ...
}
public interface NotifyMechanismInterface{ //3、定义通知机制的接口或抽象父类
public boolean doNotify(String msg);
public static NotifyMechanismInterface byEmail(){//3.1 返回一个定义了邮件通知机制的策的实现——一个匿名内部类实例
return new NotifyMechanismInterface(){
public boolean doNotify(String msg){
.......
}
};
}
public static NotifyMechanismInterface bySms(){//3.2 定义短信通知机制的实现策略
return new NotifyMechanismInterface(){
public boolean doNotify(String msg){
.......
}
};
}
public static NotifyMechanismInterface byWechat(){//3.3 定义微信通知机制的实现策略
return new NotifyMechanismInterface(){
public boolean doNotify(String msg){
.......
}
};
}
}
//4、使用场景
NOTIFY_TYPE.valueof(type).getNotifyMechanism().doNotify(msg);