使用枚举复用规则

本文介绍如何利用枚举类型替代工厂模式中的if语句,提高代码可读性和可维护性。通过枚举实现了规则的复用,避免了冗余的if判断,使代码更加简洁并具备良好的扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的简单工厂模式中,使用了工厂方法来构建不同的算法实现类。在工厂类中使用了if语句,定义了许多的if规则来判断具体要构造哪个算法实现类,这样调用类无需知道要创建具体的哪个算法实现类。

但在工厂类中仍旧有许多if的分支,怎样消灭这些if呢?

在jdk5.0引入的枚举类型,似乎可以派上用场。

枚举类型可以在一个对象只生成特定的几种对象时候用,每个生成的对象只是单例的时候用。

 

在这里,可以将各种规则定义为枚举对象,实现规则的复用:

public enum CaculateType {
	ADD('+') {
		public Caculation getOpObject() {
			return new OpAdd();
		}
	},
	SUB('-') {
		public Caculation getOpObject() {
			return new OpSub();
		}
	},
	DIV('/') {
		public Caculation getOpObject() {
			return new OpDiv();
		}
	},
	MUL('*') {
		public Caculation getOpObject() {
			return new OpMul();
		}
	};
	private char op;
	private CaculateType(char op) {
		this.op = op;
	}
	public char getOp() {
		return op;
	}
	public abstract Caculation getOpObject();
	public static Caculation getCaculation(char op) {
		for (CaculateType type : CaculateType.values()) {
			if (type.getOp() == op) {
				return type.getOpObject();
			}
		}
		return null;
	}
}

 

 这样,在使用时,通过枚举类的方法就可以了:

Caculation caculation = CaculateType.getCaculation(operator.charAt(0));
caculation.setNumberA(getNumber(numberA));
caculation.setNumberB(getNumber(numberB));
System.out.println("Result  is:"+caculation.caculate());

 

 

照旧,列出相互的耦合关系:

 调用类枚举类抽象类具体算法实现类
调用类 耦合耦合 
枚举类  耦合耦合
抽象类    
具体算法实现类  继承 

可以发现,耦合关系上,枚举类取代了工厂类的作用。

引入枚举类的优点:

  • 规则的可复用
  • 避免if代码,只要扩展枚举类就可以扩展规则(高可扩展性)
  • 使用枚举类决定使用何种算法时,同样可扩展

对于范围字段,同样可以使用枚举定义规则:

public interface CheckUsable {
	public boolean isOK(int value);
}

 

枚举类实现此接口,并进行检查:

public enum NumberState implements CheckUsable{
	SMALL(1,100){
		public boolean isOK(int value){
			if(1<value&&value<=100){
				return true;
			}
			return false;
		}
	},BIG(101,Integer.MAX_VALUE){
		public boolean isOK(int value){
			if(value>100){
				return true;
			}
			return false;
		}
	};
	private int min;	
	private int max;
	private  NumberState(int max , int min) {
		this.max = max;
		this.min = min;
	}
	/**
	 * 也可以不返回此State,可以直接返回在何种枚举类型下的算法类
	 * @param value
	 * @return
	 */
	public static NumberState checkProper(int value){
		NumberState Estate = null;//也可以设为default的那个
		for(NumberState state: NumberState.values()){
			if(state.isOK(value)){
				Estate = state;
			}
		}
		return Estate;
	}
}

 

 

OK,一切都是可复用的

 

 

实际上,对于避免if的高扩展类,还可使用状态模式,以后我再研究...

<think>好的,我现在需要帮助用户解决如何在CTConditionalFormatting中设置单元格大于的条件格式规则的问题。首先,我需要回顾用户之前的问题和我的回答,确保这次回答的一致性。用户之前询问了如何同时使用XSSFSheetConditionalFormatting和CTConditionalFormatting,现在他们更具体地想知道如何使用CT类单独设置大于规则。用户可能是在使用ApachePOI处理Excel文件时,遇到了需要直接操作底层XML结构的情况。他们可能已经尝试过高级API,但发现某些功能需要更细致的控制,所以转向CT类。我需要确保回答详细且步骤清晰,避免用户在使用过程中遇到障碍。 首先,我需要明确CTConditionalFormatting和CTCfRule的关系。CTConditionalFormatting代表整个条件格式规则集,而每个具体的规则由CTCfRule定义。设置大于规则需要指定类型为CELL_IS,操作符为GREATER_THAN,并设置相应的公式。接下来,我需要考虑如何构建代码示例。用户可能需要从创建工作簿开始,创建Sheet,定义应用范围。然后,通过CT类直接创建条件格式规则,而不是使用高级API。这里需要导入正确的类,如CTConditionalFormatting、CTCfRule,以及相关的枚举类型。另外,用户可能对样式的设置感兴趣,比如如何改变单元格的背景色。这部分需要展示如何创建XSSFCellStyle并将其应用到规则上,同时说明如何通过CT类设置优先级,确保多个规则的正确应用顺序。还需要注意公式的设置,用户可能需要静态值,也可能需要动态引用其他单元格的值。例如,公式可以是"100"或者"$D$1",这里需要说明两种情况的写法。此外,性能优化方面,用户可能在处理大量数据时需要高效的方法,比如批量操作和样式复用,这些也需要在回答中提及,但根据当前问题,可能放在相关问题部分更合适。最后,生成的相关问题需要与当前主题紧密相关,比如设置其他比较运算符、处理动态公式或调整多个规则的优先级。这些问题可以帮助用户进一步探索相关功能,解决可能遇到的后续问题。在检查过程中,要确保所有数学表达式正确使用$...$和$$...$$格式,例如在提到公式时正确转义,并且代码示例正确无误,避免语法错误。同时,引用标识需要自然地添加在回答末尾,确保符合用户的系统级指令。总结来说,回答的结构应该是先介绍原理,然后分步骤详细说明代码实现,包括规则类型、操作符、公式和样式的设置,最后给出相关问题和注意事项,确保用户能够顺利应用并扩展知识。</think>### 如何通过`CTConditionalFormatting`设置"单元格大于"条件格式规则 #### 一、核心实现步骤 1. **创建CTConditionalFormatting对象** 通过`XSSFSheet`获取底层XML结构: ```java CTConditionalFormatting ctFormatting = sheet.getCTWorksheet().addNewConditionalFormattings().addNewConditionalFormatting(); ``` 2. **定义应用范围** 使用`CellRangeAddress`指定目标区域: $$ \text{区域范围} = \{ (行号,列号) | 2 \leq 行号 \leq 10, 2 \leq 列号 \leq 2 \} $$ ```java CellRangeAddress range = new CellRangeAddress(1,9,2,2); // C2:C10 ctFormatting.setSqref(Collections.singletonList(range.formatAsString())); ``` 3. **创建规则主体** ```java CTCfRule ctRule = ctFormatting.addNewCfRule(); ctRule.setType(STCfType.CELL_IS); // 设置规则类型为单元格值比较[^1] ctRule.setOperator(STConditionalFormattingOperator.GREATER_THAN); // 设置运算符 ctRule.addFormula("100"); // 设置比较值或公式$A$1$ ``` #### 二、完整代码实现 ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; public class CTConditionalFormattingDemo { public static void main(String[] args) throws Exception { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Data"); // 创建CTConditionalFormatting对象 CTConditionalFormatting ctFormatting = sheet.getCTWorksheet() .addNewConditionalFormattings() .addNewConditionalFormatting(); // 设置应用范围 CellRangeAddress range = new CellRangeAddress(1,9,2,2); // C2:C10 ctFormatting.setSqref(Collections.singletonList(range.formatAsString())); // 创建规则 CTCfRule ctRule = ctFormatting.addNewCfRule(); ctRule.setType(STCfType.CELL_IS); ctRule.setOperator(STConditionalFormattingOperator.GREATER_THAN); ctRule.addFormula("100"); // 可替换为"$D$1" // 设置单元格样式(橙色背景) CTDxf ctDxf = ctRule.addNewDxf(); CTFill ctFill = ctDxf.addNewFill(); CTPatternFill ctPattern = ctFill.addNewPatternFill(); ctPattern.setPatternType(STPatternType.SOLID); CTColor bgColor = ctPattern.addNewBgColor(); bgColor.setIndexed(IndexedColors.ORANGE.getIndex()); // 保存文件 try (FileOutputStream fos = new FileOutputStream("CTConditionFormat.xlsx")) { workbook.write(fos); } } } ``` #### 三、关键参数说明 1. **运算符类型对照表** | XML枚举值 | 对应含义 | |-----------------------------|---------------------| | `GREATER_THAN` | > | | `GREATER_THAN_OR_EQUAL` | >= | | `LESS_THAN` | < | | `LESS_THAN_OR_EQUAL` | <= | 2. **公式动态绑定技巧** ```java // 引用其他单元格的值 String dynamicFormula = "$D$1*2"; ctRule.getFormulaList().set(0, dynamicFormula); ``` 当公式需要动态计算时,可使用`CTCfRule.getFormulaList()`进行修改[^2] #### 四、特殊场景处理 1. **多条件叠加** 通过添加多个`CTCfRule`实现: ```java CTCfRule secondRule = ctFormatting.addNewCfRule(); secondRule.setType(STCfType.CELL_IS); secondRule.setOperator(STConditionalFormattingOperator.LESS_THAN); secondRule.addFormula("50"); secondRule.setPriority(2); // 设置优先级[^3] ``` 2. **公式错误处理** ```java try { ctRule.addFormula("SUM(A1:A10)"); // 复杂公式 } catch (IllegalStateException e) { System.err.println("公式语法错误: " + e.getMessage()); } ``` $$ \text{规则有效性} = \begin{cases} 1 & \text{当 } \exists \text{合法公式} \\ 0 & \text{其他情况} \end{cases} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值