通过枚举和工厂模式解决if-else语句

枚举方式

一、接口

public interface DoThing {
    void doThing();
}

二、枚举类

public enum EnumThing implements DoThing {
    ADMIN{
        @Override
        public void doThing() {
            System.out.println("111");
        }
    },
    ROLE1{
        @Override
        public void doThing() {
            System.out.println("222");
        }
    },
    ROLE2{
        @Override
        public void doThing() {
            System.out.println("333");
        }
    }
}

三、调用

EnumThing.valueOf("ADMIN").doThing();

静态工厂方式 

工厂模式解决if-else“分支过多”问题

不同分支做不同的事情,很明显就提供了使用工厂模式的契机,我们只需要将不同情况单独定义好,然后去工厂类里面聚合即可。

首先,针对不同的角色,可以单独定义其业务类:

1

2

3

4

5

6

7

8

9

10

11

//系统管理员(有A操作权限)

public class RootAdminRole implements Role0peration {

    private String roleName ;

    public RootAdminRole( String roleName){

        this.roleName = roleName ;

    }

    @Override

    public String op() {

        return roleName + "has AAA permission" ;

    }

}

1

2

3

4

5

6

7

8

9

10

11

//订单管理员(有B操作权限)

public class OrderAdminRole implements RoleOperation {

    private String roleName ;

    public OrderAdminRole( String roleName ) {

        this.roleName = roleName ;

    }

    @Override

    public String op() {

        return roleName + "has BBB permission";

    }

}

1

2

3

4

5

6

7

8

9

10

11

//普通用户(有C操作权限)

public class NormalRole implements RoleOperation {

    private String roleName ;

    public NormalRole( String roleName){

        this.roleName = roleName;

    }

    @Override

    public String op() {

        return roleName + "has CCC permission";

    }

}

接下来再写一个工厂类 RoleFactory对上面不同角色进行聚合:

1

2

3

4

5

6

7

8

9

10

11

12

public class RoleFactory {

    static Map<String, Role0peration> roleOperationMap = new HashMap<>();

    //在静态块中先把初始化工作全部做完

    static {

        role0perationMap.put( "ROLE_ ROOT_ ADMIN", new RootAdminRole("ROLE_ _ROOT_ ADMIN") ) :

        roleOperationMap.put( "ROLE_ ORDER_ ADMIN", new OrderAdminRole("ROLE_ ORDER_ ADMIN") );

        role0perationMap.put( "ROLE_ NORMAL", new NormalRole("ROLE_ NORMAL") );

    }

    pub1ic static RoleOperation getOp( String roleName ) {

        return roleOperationMap.get( roleName ) ;

    }

}

接下来借助上面这个工厂,业务代码调用也只需一行代码, if/else同样被消除了:

1

2

3

4

5

6

public class JudgeRole {

    public String judge(String roleName){

        //一行代码搞定!  之前的if/else也没了!

        return RoleFactory.get0p(roleName).op();

    }

}

这样的话以后想扩展条件也很容易,只需要增加新代码,而不需要动以前的业务代码,非常符合“开闭原则”。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值