You have a conditional that chooses different behavior depending on the type of an object.
Move each leg of the conditional to an overriding method in a subclass. Make the original method
abstract.
当有条件句,它根据对象类型来选择不同的行为,这时就可以将条件句的每一个分支搬移到子类的覆盖方法中来实现。

假设这是原始代码:
class Employee...
int payAmount() {
switch (getType()) {
case EmployeeType.ENGINEER:
return _monthlySalary;
case EmployeeType.SALESMAN:
return _monthlySalary + _commission;
case EmployeeType.MANAGER:
return _monthlySalary + _bonus;
default:
throw new RuntimeException("Incorrect Employee");
}
}
int getType() {
return _type.getTypeCode();
}
private EmployeeType _type;
abstract class EmployeeType...
abstract int getTypeCode();
class Engineer extends EmployeeType...
int getTypeCode() {
return Employee.ENGINEER;
}
... and other subclasses

After using Replace Conditional with Polymorphism:
// client
class Employee...
int payAmount() {
return _type.payAmount(this);
}
// interface
class EmployeeType...
abstract int payAmount(Employee emp);
// some concrete classes
class Engineer...
int payAmount(Employee emp) {
return emp.getMonthlySalary();
}
class Salesman...
int payAmount(Employee emp) {
return emp.getMonthlySalary() + emp.getCommission();
}
class Manager...
int payAmount(Employee emp) {
return emp.getMonthlySalary() + emp.getBonus();
}

- 大小: 34.7 KB

- 大小: 2.1 KB
分享到:
相关推荐
"Replace Conditional With Polymorphism"(用多态替换条件语句)是马丁·福勒在其经典著作《重构:改善既有代码的设计》中提出的一种重构模式。这个模式的目标是消除条件判断,通过引入多态性来提升代码的清晰度和...
9.6 Replace Conditional with Polymorphism(以多态取代条件表达式) 9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数调用 10.1 Rename Method(函数改名) 10.2 Add...
- **替换条件语句与多态(Replace Conditional with Polymorphism)**:使用多态性替代条件语句,提高代码的灵活性。 #### 三、总结 重构是提升代码质量和可维护性的关键过程。通过对现有代码进行有目的的改进,...
Replace Conditional with Polymorphism 用多态代替条件语句 Introduce Null Object 引入Null对象 Introduce Assertion 引入断言 Chapter 10:Making Method Calls Simpler 简化方法调用 Rename ...
Replace Conditional with Polymorphism 用多态代替条件语句 Introduce Null Object 引入Null对象 Introduce Assertion 引入断言 Chapter 10:Making Method Calls Simpler 简化方法调用 Rename ...
Replace Conditional with Polymorphism 用多态代替条件语句 Introduce Null Object 引入Null对象 Introduce Assertion 引入断言 Chapter 10:Making Method Calls Simpler 简化方法调用 Rename...
Replace Conditional with Polymorphism 用多态代替条件语句 Introduce Null Object 引入Null对象 Introduce Assertion 引入断言 Chapter 10:Making Method Calls Simpler 简化方法调用 Rename ...
Replace Conditional with Polymorphism 用多态代替条件语句 Introduce Null Object 引入Null对象 Introduce Assertion 引入断言 Chapter 10:Making Method Calls Simpler 简化方法调用 Rename...
9.6 Replace Conditional with Polymorphism(以多态取代条件表达式) 255 9.7 Introduce Null Object(引入Null对象) 260 9.8 Introduce Assertion(引入断言) 267 第10章 简化函数调用 271 10.1 Rename...
9.6 Replace Conditional with Polymorphism(以多态取代条件式) 9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数呼叫 10.1 Rename Method(重新命名函数) 10.2 ...
4. **多级条件语句转换为多态(Replace Conditional with Polymorphism)**:如果在一个方法中有复杂的条件判断逻辑,可以考虑使用面向对象的多态特性来简化代码。 ### 如何快速提升重构能力 1. **学习重构模式**...
2. **重构策略与技术**:马丁·福勒提出了一系列具体的重构手法,如提取方法(Extract Method)、提取类(Extract Class)、替换条件为命令(Replace Conditional with Polymorphism)等。这些手法提供了改善代码...
6. 用多态代替条件表达式(Replace Conditional with Polymorphism):当需要使用条件表达式(如if-else或switch)来决定具体的行为时,可以考虑使用多态来代替。这样做可以使行为更加灵活,易于扩展和维护。 7. ...
- **多态替换条件表达式(Replace Conditional with Polymorphism)**:使用继承和多态性来替换复杂的条件语句。 #### Java开发中的重构实践 - **IDE支持**:现代的集成开发环境(如IntelliJ IDEA或Eclipse)提供了...
3. **替换条件为函数(Replace Conditional with Polymorphism)**:通过多态性来取代复杂的条件语句,使代码更易于理解和维护。 4. **将类拆分为子类(Split Class)**:如果一个类承担过多职责,可以将其拆分成多...