记录一次工厂+策略设计模式的应用
工厂:创建对象。
策略:某个行为。
举个简单的例子:我们会支付的时候可以用花呗、余额宝、余额、银行卡进行支付。
- 最原始的方式
public class PayService{
public void pay(String type) {
if ("花呗".equals(type)) {
// 花呗支付逻辑
} else if ("余额宝".equals(type)) {
// 余额宝支付逻辑
} else if ("余额".equals(type)) {
// 余额支付逻辑
} else if ("银行卡".equals(type)) {
// 银行卡支付逻辑
}
}
}
- 枚举的方式
public class PayService{
public void pay(PayType type) {
switch(type) {
case "花呗": {
// 花呗支付逻辑
break;
}
case "余额宝": {
// 余额宝支付逻辑
break;
}
case "余额": {
// 余额支付逻辑
break;
}
case "银行卡": {
// 银行卡支付逻辑
break;
}
default: throw new RuntimeException();
}
}
}
- 工厂和策略
定义一个工厂,项目启动的时候,同一个包下中的组件就会注册到context中。
@Component()
public class PayFactory {
@Autowried
private Map<String,PayStrategy> context;
public PayStrategy getPayComponent(String beanId) {
PayStrategy strategy = context.get(beanId);
if (null == strategy) {
throw new Exception();
}
return strategy;
}
}
定义一个支付策略接口。
public interface PayStrategy {
void pay();
}
定义花呗支付的实现逻辑。
@Component()
public class HuaBeiPayStrategy implements PayStrategy {
public void pay() {
// 花呗支付逻辑
}
}
定义余额宝支付的实现逻辑。
@Component()
public class YuEBaoPayStrategy implements PayStrategy {
public void pay() {
// 余额宝支付逻辑
}
}
定义余额支付的实现逻辑。
@Component()
public class YuEPayStrategy implements PayStrategy {
public void pay() {
// 余额支付逻辑
}
}
定义银行卡支付的实现逻辑。
@Component()
public class BankPayStrategy implements PayStrategy {
public void pay() {
// 银行卡支付逻辑
}
}
@Service
public class PayService {
@Autowried
private PayFactory factory;
public void pay(String type) {
factory.getPayComponent(type).pay();
}
}
当我们新增支付方式时,我们只需要添加一个PayStrategy的具体实现即可。
当几种支付方式存在相同的逻辑,可抽象成一个类,具体的策略继承该抽象类,代码也会变得更加简洁。