How To Use Switch Case Avoid Open Closed Principle

How To Use Switch Case Avoid Open Closed Principle

How To Use Switch Case Avoid Open Closed Principle

How To Use Switch Case Avoid Open Closed Principle

繼上一篇https://davidchenblog.com/posts/fcbdf16e/#more

解決方法是將switch case做在abstract factory下,不讓其它系統
看到switch case。這個factory會使用switch case來產生對應的instance
。因此,不同function中,calculatePay、isPayday、deliverPay都藉由
Employee interface,透過多型的方式來指派。

使用switch的準則是,如果只出現一次,且用來產生多型物件,並藏匿在某個
繼承關係之下,使其它系統看不到。就可以容忍使用switch case。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}

public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throw InvalidEmployeeType;
}

public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throw InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED:
return new CommissionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
return new SalariedEmployee(r);
default:
throw new InvalidEmployeeType(r.type);
}
}
}