父类
public abstract class GeneralChannelRule {
public abstract void process();
}
枚举类,只需要增加
import javax.print.attribute.standard.Sides;
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 String getName() {
return name;
}
public GeneralChannelRule getChannel() {
return 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 class TencentChannelRule extends GeneralChannelRule {
@Override
public void process() {
// TODO Auto-generated method stub
System.out.println("ten腾讯企鹅");
}
}
实现父类
public class TouTiaoChannelRule extends GeneralChannelRule {
@Override
public void process() {
// TODO Auto-generated method stub
System.out.println("今日头条");
}
}
public class Test {
public static void main(String[] args) {
String sign ="TENCENT";
ChannelRuleEnum channelRuleEnum = ChannelRuleEnum.match(sign);
GeneralChannelRule rule =channelRuleEnum.channel;
rule.process();
}
}
解析:通过使用枚举类,在枚举中将 key 与 规则具体实现进行绑定。通过改变:
可以减少if -else使得代码更加优雅 如果需要新增渠道,我们只需要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的枚举,而不需要改动到原先的任何代码。这符合了开发封闭原则。
最后
以上是通过枚举来巧妙干掉if-else的方案,对于减少 if-else 还有很多有趣的解决方案(如:状态设计模式等),感兴趣的朋友去查阅相关的资料。