java 消除闹心的if-else方法
if/else是程序员的”标配“:简单,少量的if/else代码看起来逻辑清晰,易读。但是随着逻辑的复杂化简单if/else层层叠加代码不美观而且冗余,容易被接手的后浪嘲笑。。。。
简单的一个系统就分为几个角色,例如普通会员,黄金会员,钻石会员
CommonRole:普通会员
GoldRole:黄金会员
DiamondRole:钻石会员
每个会员角色都有相应的权限(行为),通常我们的写法是
public void roleDo(String roleName){
if(roleName.equals("CommonRole")){
System.out.println("我是普通会员");
}
if(roleName.equals("GlodRole")){
System.out.println("我是黄金会员");
}
if(roleName.equals("DiamondRole")){
System.out.println("我是钻石会员");
}
}
如果增加角色修改代码会很麻烦,不负责高内聚,低耦合原则。
工厂模式
现在对上面代码进行修改,首先创建公共接口Role,其他角色实现公共接口Role
//角色接口
public interface Role {
void doSomething();
}
//普通会员
public class CommonRole implements Role {
@Override
public void doSomething() {
System.out.println("我是普通会员");
}
}
//黄金会员
public class GlodRole implements Role {
@Override
public void doSomething() {
System.out.println("我是黄金会员");
}
}
//钻石会员
public class DiamondRole implements Role {
@Override
public void doSomething() {
System.out.println("我是钻石会员");
}
}
新建工厂类
public class FactoryRole {
public static Role factoryDo(String roleName){
if(roleName.equals("CommonRole")){
return new CommonRole();
}
else if(roleName.equals("GlodRole")){
return new GlodRole();
}
else{
return new DiamondRole();
}
}
}
调用
public static void main(String[] args) {
FactoryRole.factoryDo("CommonRole").doSomething();
}
上述代码虽然增加了工厂类,但是只是将复杂的if/else移到了工厂类中,并没有消除。
利用HashMap改造工厂模式
利用hashmap的key,value特性可以改造工厂模式
private static Map<String,Role> roleMap=new HashMap<>();
//静态代码块初始化map
static {
roleMap.put("CommonRole",new CommonRole());
roleMap.put("GlodRole",new GlodRole());
roleMap.put("DiamondRole",new DiamondRole());
}
public static Role factoryDo(String roleName){
return roleMap.get(roleName);
}
调用
public static void main(String[] args) {
FactoryRole.factoryDo("CommonRole").doSomething();
}
这样就消除了if/esle,后续如果我们增加新的角色,只需要新建类实现Role,然后在静态代码块中添加即可。