营销型网站建设+课程一个网站建设多少钱

当前位置: 首页 > news >正文

营销型网站建设+课程,一个网站建设多少钱,logo设计公司排行榜,南宁比较好的设计公司文章目录 背景案例第一阶段 萌芽第二阶段 屎上雕花第三阶段 策略工厂模式重构第四阶段 优化 总结 背景 大家好#xff0c;我是大表哥laker。今天#xff0c;我要和大家分享一篇关于如何使用策略模式和工厂模式消除If Else耦合问题的文章。这个方法能够让你的代码更加优美、简… 文章目录 背景案例第一阶段 萌芽第二阶段 屎上雕花第三阶段 策略工厂模式重构第四阶段 优化 总结 背景 大家好我是大表哥laker。今天我要和大家分享一篇关于如何使用策略模式和工厂模式消除If Else耦合问题的文章。这个方法能够让你的代码更加优美、简洁和易于维护。 在团队中我们都希望成为一个编码能力比较牛的人给leader一个眼前一亮的代码。 在面试中也想给面试官讲出项目中的亮点凸显自己的价值。 在开发中大家都不想屎上雕花遇到代码难以维护的问题一个小的业务改动都需要改动一大坨代码加班加点也难以解决问题。
老表们因此今天我分享这篇文章希望能够帮助大家解决这些问题让你在编写代码时更加高效少加班多点时间享受生活。 案例 在用户支付模块中不同的支付方式有着不同的实现方式例如微信支付、支付宝支付、银联支付等用户可以自由选择支付方式去支付。在代码实现中常常会使用大量的 If Else 语句来判断用户选择的支付方式并根据不同的支付方式调用不同的处理逻辑。 第一阶段 萌芽 项目刚开始阶段我们只接入了支付宝和微信支付此时支付模块代码如下 Service public class PaymentService {Autowiredprivate AliPayService aliPayService;Autowiredprivate WeChatPayService weChatPayService;public String pay(String payType,PayRequest request) {if (aliPay.equals(payType)) {return aliPayService.pay(request);} else if (weChatPay.equals(payType)) {return weChatPayService.pay(request);} // 不支持的支付方式抛出异常throw new RuntimeException(Unsupported pay type: payType);} }此时这种写法是没问题的也符合当前的状态。 第二阶段 屎上雕花 后来随着业务拓展的不错用户量变大我们又需要支持其他支付方式例如银联支付和汇付天下支付等核心主干代码修改如下 Service public class PaymentService {Autowiredprivate AliPayService aliPayService;Autowiredprivate WeChatPayService weChatPayService;Autowiredprivate UnionPayService unionPayService;Autowiredprivate AdaPayService adaPayService;public String pay(String payType,PayRequest request) {if (aliPay.equals(payType)) {return aliPayService.pay(request);} else if (weChatPay.equals(payType)) {return weChatPayService.pay(request);// 改动这里的核心主干代码} else if (unionPay.equals(payType)) {return unionPayService.pay(request);} else if (adaPay.equals(payType)) {return adaPayService.pay(request);} // 改动这里的核心主干代码// 不支持的支付方式抛出异常throw new RuntimeException(Unsupported pay type: payType);} }这个时候如果你不去重构而是沿着这种方式继续写代码就会有隐患了此时我们就开始“屎上雕花”。 这种实现方式会导致代码可维护性差、代码复杂度高同时也会增加代码修改的难度。 重点重点重点这样写有什么问题呢 1.可以预见随着业务量增长我们肯定还会增加其他方式的支付那么还需要直接修改主干代码而我们提倡代码应该是对修改封闭的。 2.支付模块与具体的支付方式高度耦合例如微信支付需要增加什么参数我们还是需要直接修改主干代码这导致接口的改变将直接影响到代码的组织使得代码的可维护性降低。 第三阶段 策略工厂模式重构 我们要进行重构以实现在现在和未来的扩展时不会修改主干代码这里我们将使用策略模式工厂模式来解决此问题实现代码更易读、更易扩展。 第一步 首先我们定义了一个PayStrategy接口并在接口中定义了一个pay()方法它将接收一个PayRequest对象并返回一个字符串。 public interface PayStrategy {String pay(PayRequest request); }第二步 接下来我们需要为每个具体策略实现创建一个实现类。 Component(aliPay) public class AliPayStrategy implements PayStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用支付宝支付成功;} } Component(weChatPay) public class WeChatPayStrategy implements PayStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用微信支付成功;} } Component(unionPay) public class UnionPayStrategy implements PayStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用银联支付成功;} } Component(adaPay) public class AdaPayStrategy implements PayStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用汇付天下支付成功;} }第三步 我们需要定义一个工厂类来生产具体策略实现对象。这里我们使用了Spring的Autowired注解来自动注入所有实现了PayStrategy接口的类然后根据不同的支付方式返回对应的实现类 Component public class PaymentFactory {Autowiredprivate MapString, PayStrategy payStrategyMap;public PayStrategy getPayStrategy(String payType) {PayStrategy payStrategy payStrategyMap.get(payType);if (payStrategy null) {throw new RuntimeException(Unsupported pay type: payType);}return payStrategy;} }在PayFactory类中我们使用了Autowired注解来自动注入所有实现了PayStrategy接口的类这样我们就可以动态地将新的支付方式添加到系统中而无需修改工厂类的代码。然后我们定义了一个getPayStrategy()方法它接收一个支付方式作为参数然后根据支付方式返回对应的实现类。 第四步 最后我们修改PaymentService中的pay方法用PayFactory类来获取具体策略实现对象并调用其pay()方法进行支付。 Service public class PaymentService {Autowiredprivate PaymentFactory paymentFactory;public String pay(String payType, PayRequest request) {PayStrategy payStrategy paymentFactory.getPayStrategy(payType);return payStrategy.pay(request);} }在PaymentService类中我们使用了Autowired注解来自动注入PayFactory类的实例。然后我们定义了一个pay()方法它接收一个支付方式和一个PayRequest对象作为参数然后通过PayFactory类获取对应的具体策略实现对象并调用其pay()方法。 通过使用策略模式和工厂模式我们成功消除了代码中的if-else语句使得代码更加优美、简洁、易于维护。而且当我们需要添加新的支付方式时只需要添加一个实现了PayStrategy接口的类即可。 以增加农业银行卡支付为例我们的修改点仅仅是添加了一个如下的类即可。 这里可以看到当我们有新的支付方式加入时你是增加新的类而不是修改原有的类。 Component(NYBankPay) public class NYBankPayStrategy implements PayStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用农业银行支付成功;} }第四阶段 优化 为了更方便地管理支付方式我们可以使用枚举类PaymentTypeEnum其中包含了所有的支付方式如支付宝、微信支付、银联支付等。 例如我们可以通过如下方式定义PaymentTypeEnum枚举类 public enum PaymentTypeEnum {ALIPAY(aliPay),WECHAT_PAY(wechatPay),UNION_PAY(unionPay);private String name;PaymentTypeEnum(String name) {this.name name;}public static PaymentTypeEnum getPaymentType(String name){for (PaymentTypeEnum paymentTypeEnum : values()) {if (paymentTypeEnum.name.equals(name)) {return paymentTypeEnum;}}throw new RuntimeException(Unsupported pay type: name);}public String getName() {return name;} }然后在我们的支付服务中我们可以通过获取支付请求中的支付方式枚举来决定使用哪一种支付方式例如 Service public class PaymentService {Autowiredprivate PaymentFactory paymentFactory;// 限定参数 PaymentTypeEnum.getPaymentType(payType)public String pay(PaymentTypeEnum payType, PayRequest request) {PayStrategy payStrategy paymentFactory.getPayStrategy(payType);return payStrategy.pay(request);} }通过这种方式我们可以非常方便地添加、管理、切换不同的支付方式使得我们的代码更加灵活、可扩展。 其他相关代码修改如下 // 新增抽象策略类用于实现每个具体实现类的具体支付枚举类型 public abstract class AbstractPaymentStrategy implements PayStrategy{public abstract PaymentTypeEnum paymentType(); } // 对应修改具体支付实现类 Component public class AliPayStrategy extends AbstractPaymentStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用支付宝支付成功;}// 这里代表这个实现类是aliPay类型支付Overridepublic PaymentTypeEnum paymentType() {return PaymentTypeEnum.ALIPAY;} }Component public class WeChatPayStrategy extends AbstractPaymentStrategy {Overridepublic String pay(PayRequest request) {// 具体的支付逻辑return 使用微信支付成功;}Overridepublic PaymentTypeEnum paymentType() {return PaymentTypeEnum.WECHAT_PAY;} }Component public class PaymentFactory {private final MapPaymentTypeEnum, PayStrategy payStrategyMap new HashMap();// 通过这种方式来实现工厂注册Autowiredpublic PaymentFactory(ListAbstractPaymentStrategy payStrategyList) {payStrategyList.forEach(payStrategy - payStrategyMap.put(payStrategy.paymentType(), payStrategy));}public PayStrategy getPayStrategy(PaymentTypeEnum payType) {PayStrategy payStrategy payStrategyMap.get(payType);if (payStrategy null) {throw new RuntimeException(Unsupported pay type: payType);}return payStrategy;} }总结 当使用if-else或switch语句进行复杂条件判断时代码会变得难以阅读和维护。这时使用策略模式和工厂模式可以有效消除条件判断语句使代码更加优美、简洁、易于维护。 当你coding时碰到if-else或switch语句你就要想一想能不能用策略模式和工厂模式来优化它 使用策略模式和工厂模式的场景包括选择算法、支付方式、优惠方式、根据类型调用不同的系统等。 策略模式和工厂模式的优点包括扩展性好、符合开闭原则、符合单一职责原则、可读性好、便于维护、避免多层判断等。 然而缺点是当策略增多时策略类的数量也会增加对于新手读代码不友好过度使用设计模式也是很危险的。 注意没有银弹 没有银弹 使用设计模式是为了更好地解决业务问题而不是为了设计模式而使用设计模式。过度设计同样是不可取的。