场景:当咱们接收到一些数据须要对其进行处理时,因为它们来自于不一样的渠道(如:腾讯,头条),不一样渠道所需的处理方式不一样,下面咱们写一个简单Demo来实现该的场景。设计模式
一、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不一样的渠道都须要实现该抽象方法。ide
`public abstract class GeneralChannelRule {` `public abstract void process();` `}`
二、编写一个腾讯的规则类,定义具体对于腾讯渠道数据的处理逻辑优化
`public class TencentChannelRule extends GeneralChannelRule` `@Override` `public void process() {` `// Tencent处理逻辑` `}` `}`
三、编写一个头条的规则类,定义具体对于头条数据的处理逻辑this
`public class TouTiaoChannelRule extends GeneralChannelRule` `@Override` `public void process() {` `// TouTiao处理逻辑` `}` `}`
四、创建一个简单的枚举类spa
`public enum ChannelRuleEnum {` `/**` `* 头条` `*/` `TOUTIAO("TOUTIAO"),` `/**` `* 腾讯` `*/` `TENCENT("TENCENT"),` `;` `....` `}`
五、使用规则对数据进行处理。设计
`public static void main(String[] args) {` `//这里咱们模拟接收到的数据,其渠道为为TOUTIAO,来自头条的数据` `String sign = "TOUTIAO";` `GeneralChannelRule rule;` `//根据对应渠道获取对应的具体规则实现类` `if (ChannelRuleEnum.TENCENT.code.equals(sign)) {` `rule = new TencentChannelRule();` `} else if (ChannelRuleEnum.TOUTIAO.code.equals(sign)) {` `rule = new TouTiaoChannelRule();` `} else {` `//匹配不到` `}` `//执行` `rule.process();` `}`
解析:若是经过上面的方式,则存在则两个缺点。code
当咱们须要新增新的渠道的时候,须要对main方法中的逻辑进行修改调整。这违背了设计模式中的开放封闭规则。开放封闭原bai则的核心的思想是软件实体是可扩du展,而不可zhi修改的。继承
也就是说,对扩展是开dao放的,而对修改是封闭的开发
新增渠道后,修改代码会产生大量的if else,不太优雅。为了解决以上的两个问题,咱们能够借助枚举类来巧妙优化。get
一、下面咱们调整一下枚举类,增长一个GeneralChannelRule属性,而且给对应渠道构建对应的GeneralChannelRule实现类,新增一个match() 匹配方法。
`public enum ChannelRuleEnum {` `/**` `* 头条` `*/` `TOUTIAO("TOUTIAO",new TouTiaoChannelRule()),` `/**` `* 腾讯` `*/` `TENCENT("TENCENT",new TencentChannelRule()),` `;` `public String name;` `public GeneralChannelRule channel;` `ChannelRuleEnum(String name, GeneralChannelRule channel) {` `this.name = name;` `this.channel = channel;` `}` `//匹配` `public static ChannelRuleEnum match(String name){` `ChannelRuleEnum[] values = ChannelRuleEnum.values();` `for (ChannelRuleEnum value : values) {` `if(value.name.equals(name)){` `return value;` `}` `}` `return null;` `}` `public String getName() {` `return name;` `}` `public GeneralChannelRule getChannel() {` `return channel;` `}` `}`
二、改写程序
`public static void main(String[] args) {` `String sign = "TOUTIAO";` `ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign);` `GeneralChannelRule rule = channelRule.channel;` `rule.process(sign);` `}`
解析:经过使用枚举类,在枚举中将 key 与 规则具体实现进行绑定。经过改变:
能够减小if -else使得代码更加优雅 若是须要新增渠道,咱们只须要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的枚举,而不须要改动到原先的任何代码。这符合了开发封闭原则。
以上是经过枚举来巧妙干掉if-else的方案,对于减小 if-else 还有不少有趣的解决方案(如:状态设计模式等),感兴趣的朋友去查阅相关的资料。