场景:当我们收到一些数据并需要处理时,由于它们来自不同的渠道(例如腾讯,头条),因此不同的渠道需要不同的处理方法。
让我们编写一个简单的Demo来实现这种情况。
。
解决方案1.首先,构造GeneralChannelRule基本规则的抽象类,并定义抽象方法process()。
不同的渠道需要实现此抽象方法。
公共抽象类GeneralChannelRule {公共抽象无效process();} 2.编写腾讯规则类并为腾讯渠道数据定义特定的处理逻辑公共类TencentChannelRule扩展了GeneralChannelRule @Override public void process(){腾讯处理逻辑} 3.编写一个标题规则类并为标题数据定义特定的处理逻辑公共类TouTiaoChannelRule扩展了GeneralChannelRule public void process(){TouTiao处理逻辑// TouTiao处理逻辑}}}创建一个简单的ChannelRule枚举publicEnum {/ ** Headline * / TOUTIAO(“ ;“ TOUTIAO”,TENCENT(“ TENCENT”),TENCENT(“ TENCENT”)5.使用规则来处理数据。
public static void main(String [] args){//在这里,我们模拟接收到的数据,频道为TOUTIAO,标题中的数据为String sign =“ TOUTIAO”; GeneralChannelRule规则;如果(ChannelRuleEnum.TENCENT.code.equals(sign)){rule = new TencentChannelRule();},则根据相应的通道规则实现类型获取相应的通道;否则,如果(ChannelRuleEnum.TOUTIAO.code.equals(sign)){ChannelRuleEnum .TOUTIAO.code.equals(sign)){ChannelRuleEnum.TOUTIAO.code.equals(sign)){ChannelRuleEnum。
//无法匹配}}}}}} –执行rule.process();}分析:如果采用上述方法,则有两个缺点。
当我们需要添加新通道时,我们需要修改main方法中的逻辑。
这违反了设计模式中的开放规则和封闭规则。
开放和封闭原则的核心思想是软件实体可以扩展而不能修改。
换句话说,展开是打开的,但修改是关闭的。
添加通道后,修改代码会生成很多其他情况,这不是很优雅。
为了解决以上两个问题,我们可以使用枚举类进行巧妙的优化。
新思路1.让我们调整枚举类,添加GeneralChannelRule属性,并为相应的通道构建相应的GeneralChannelRule实现类,并添加match()匹配方法。
public Enum ChannelRuleEnum {标题TOUTIAO(“ TOUTIAO”,新的TouTiaoChannelRule()),ToutiaoChannelRuleEnum; TouTiao(“ TOUTIAO”,新的TouTiaoChannelRule());腾讯频道;腾讯频道; CENTnew Channel,CENTnew Channel,CENTnew Channel,CENTER Channel,CENTnew Channel,CENTule; ChannelRuleEnum(String name,GeneralChannelRule channel){this.name = name; this.channel = channel;} //匹配num(公共ChannelRuleEnum(用于Channelname的字符串)值ChannelRuleEnum(用于ChannelEnum的字符串)value ChannelRuleEnum(用于Channelname的字符串)[value]:values){if(value.name.equals(name) ){返回值;}}返回null;} public String getName(){return name;} public GeneralChannelRule getChannel(){return channel;}} 2,重写程序public static void main(String [] args){String sign = “ TOUTIAO”; ChannelRuleEnum ChannelRule = ChannelRuleEnum.match(sign); ChannelRule channel = channelRule.process; ign);}分析:通过使用枚举类,键被绑定到枚举中规则的特定实现。
通过更改:可以减少if-else以使代码更优雅。
如果需要添加通道,我们只需要编写特定的规则实现类并继承GeneralChannelRule抽象类,并在枚举类中添加新的枚举即可,而无需更改为任何原始代码。
这符合开发封闭原则。
最后,以上是通过枚举巧妙地杀死if-else的解决方案。
有许多有趣的解决方案可以减少if-else(例如:状态设计模式等)。
如果您有兴趣,请检查相关信息。
资料来源:www.toutiao.com/i6847406631983153672作者:Poly IT