避免大量ifelse(枚举、工厂模式、策略模式)
枚举
public class Test {
public static void main(String[] args) {
System.out.println(judge("ROLE_ROOT_ADMIN"));
}
public static String judge(String roleName){
return RoleEnum.valueOf(roleName).operation();
}
}
interface RoleOperation {
String operation();
}
enum RoleEnum implements RoleOperation {
ROLE_ROOT_ADMIN {
@Override
public String operation() {
return "root";
}
},
ROLE_ORDER_ADMIN {
@Override
public String operation() {
return "order";
}
},
ROLE_NORMAL_ADMIN {
@Override
public String operation() {
return "normal";
}
};
}
工厂模式
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
System.out.println(judge("ROLE_ROOT_ADMIN"));
}
public static String judge(String roleName) {
return RoleFactory.getOperation(roleName).operation();
}
}
interface RoleOperation {
String operation();
}
class RoleFactory {
static Map<String, RoleOperation> roleOperationMap = new HashMap<>();
static {
roleOperationMap.put("ROLE_ROOT_ADMIN", new RootAdminRole("ROLE_ROOT_ADMIN"));
roleOperationMap.put("ROLE_ORDER_ADMIN", new RootAdminRole("ROLE_ORDER_ADMIN"));
roleOperationMap.put("ROLE_NORMAL_ADMIN", new RootAdminRole("ROLE_NORMAL_ADMIN"));
}
public static RoleOperation getOperation(String name) {
return roleOperationMap.get(name);
}
}
class RootAdminRole implements RoleOperation {
private final String roleName;
public RootAdminRole(String roleName) {
this.roleName = roleName;
}
@Override
public String operation() {
return roleName + " root permission";
}
}
class OrderAdminRole implements RoleOperation {
private final String roleName;
public OrderAdminRole(String roleName) {
this.roleName = roleName;
}
@Override
public String operation() {
return roleName + " order permission";
}
}
class NormalRole implements RoleOperation {
private final String roleName;
public NormalRole(String roleName) {
this.roleName = roleName;
}
@Override
public String operation() {
return roleName + " normal permission";
}
}
策略模式
package test;
public class Test {
public static void main(String[] args) {
System.out.println(judge(new RootAdminRole("ROLE_ROOT_ADMIN")));
}
public static String judge(RoleOperation roleOperation) {
RoleContext roleContext = new RoleContext();
roleContext.setOperation(roleOperation);
return roleContext.execute();
}
}
// 策略
interface RoleOperation {
// 策略方法
String operation();
}
// 环境类:持有一个策略类的引用,最终给客户端调用
class RoleContext {
private RoleOperation roleOperation;
public void setOperation(RoleOperation roleOperation) {
this.roleOperation = roleOperation;
}
public String execute() {
return roleOperation.operation();
}
}
// 具体策略类
class RootAdminRole implements RoleOperation {
private final String roleName;
public RootAdminRole(String roleName) {
this.roleName = roleName;
}
@Override
public String operation() {
return roleName + " root permission";
}
}
class OrderAdminRole implements RoleOperation {
private final String roleName;
public OrderAdminRole(String roleName) {
this.roleName = roleName;
}
@Override
public String operation() {
return roleName + " order permission";
}
}
class NormalRole implements RoleOperation {
private final String roleName;
public NormalRole(String roleName) {
this.roleName = roleName;
}
@Override
public String operation() {
return roleName + " normal permission";
}
}
避免大量ifelse(枚举、工厂模式、策略模式)的更多相关文章
- 工厂模式&策略模式。
抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
- 3.js模式-策略模式
1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...
- 命令模式 & 策略模式 & 模板方法
一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如 ...
- <大话设计模式>工厂模式,策略模式
第一章:工厂模式: 通过封装,继承,多态解耦合 业务逻辑和界面逻辑分开 用单独的类创造实例,工厂:创造实例 工厂模式还可以用反射来实现,nsstringFromClass UML类图 聚合表示一众弱的 ...
- Go---设计模式(策略模式)
策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响. 下面用<大话设计模式>中的一个实例进行改写. 例:超市中经常进行促销活动,促销活动的促销方法就是一个个策 ...
- [Python模式]策略模式
策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换.此模式让算法的变化独立于使用算法的客户. 作为动态语言,Python实现策略模式非常容易,只要所有算法提供相同的函数即可. import ...
- java设计模式--行为型模式--策略模式
策略模式: 策略模式 概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性 1.许多相关的类仅仅是行为有异.“策略”提供了一种用多个行 ...
- 设计模式之——浅谈strategy模式(策略模式)
strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...
- [19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)
一.策略模式(strategy) [策略接口] /*** * "策略"接口 */ package cn.sxt.strategy; public interface Strateg ...
随机推荐
- 如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)
1.背景 很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了 2.实现逻辑 1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名 ...
- 美化一下WPF自带得ToolTip
对照一下原版和美化以后得版本 原版: ---------- 新版: 新增了 圆角 和 阴影效果; 第一步:新建项,最下面有一个自定义控件,取名为CornerToolTip. 第二步:系统会创建一个Co ...
- QT基础-弹出框(信息框,模态框,操作框)
学习前端知识的时候就了解到让用户使用的界面一定要足够清晰,因为你永远不知道用户会以何种方式打开你开发的软件,所以莫泰提示框就很重要了.下面将会介绍几本的集中模态对话框,用来提升用户体验! 1.模态框 ...
- C语言中的短路现象
短路现象1 比如有以下表达式 a && b && c 只有a为真(非0)才需要判断b的值: 只有a和b都为真,才需要判断c的值. 举例 求最终a.b.c.d的值. ma ...
- JavaScript设计模式样例十六 —— 备忘录模式
备忘录模式(Memento Pattern) 定义:保存一个对象的某个状态,以便在适当的时候恢复对象.目的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.场景:数据缓存. ...
- Ubuntu APT sources.list 文件格式解释
单行风格(传统) 传统的 sourses.list 文件使用单行风格配置,下面是两条单行风格的配置项: deb http://archive.ubuntu.com/ubuntu jammy main ...
- 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for说明
当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常: java.sql.SQLException: No suitable driv ...
- Java 1.8 Stream流原理与用法总结
一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream:基础接口,声明了流管理的核心 ...
- 一个SQL查询走索引时涉及到的最左前缀原则
一个SQL查询走索引时涉及到的最左前缀原则 在讲解最左前缀原则之前,先复习一下MySQL索引的重要基础知识(下面都将基于InnoDB存储引擎下的索引规则) 索引类型 主键索引 InnoDB存储引擎使用 ...
- ComfyUI 基础教程(三) —— 应用 Controlnet 精准控制图像生成
一.前言 你是否有见过下面类似这样的图片: 看起来平平无奇,当你站远点看,或者把眼睛眯成一条缝了看,你会发现,这个图中藏有一些特别的元素.这就是利用了 Ai 绘画中的 ControlNet,实现对图片 ...