微网站教程,网站开发程序哪个好,网站开发招聘年薪,网站营销推广的公司策略模式 参考#xff1a; CSDN | 策略模式百家号 | 策略模式 如果某个系统需要不同的算法#xff08;如超市收银的优惠算法#xff09;#xff0c;那么可以把这些算法独立出来#xff0c;使之之间可以相互替换#xff0c;这种模式叫做策略模式#xff0c;它同样具有三个…策略模式 参考 CSDN | 策略模式百家号 | 策略模式 如果某个系统需要不同的算法如超市收银的优惠算法那么可以把这些算法独立出来使之之间可以相互替换这种模式叫做策略模式它同样具有三个角色
环境角色使用策略的类抽象策略角色策略共有的抽象类或接口具体策略角色具体的策略的实现
策略模式的优缺点
优点
需要新的算法时只需要拓展策略而不需要修改原有代码符合开闭原则。避免出现过多判断分支提高代码可读性。算法间可方便的进行继承替换。
缺点
客户端必须熟悉所有算法并自行决定使用哪个策略策略模式将造成产生很多策略类可以通过使用享元模式在一定程度上减少对象的数量。
适用场景
一个系统中有很多类这些类之间只有行为表现不同时可以使用策略模式策略模式在实例化策略时可以配合使用简单工厂。
例
比如一个收银系统结算时有不同的优惠策略如 九折 五折满100减10等这些不同的优惠策略便是”具体策略角色“而收银系统就是 ”环境角色“还需要定义一个 ”抽象策略角色“
package pers.junebao.strategy_mode.discount;// 抽象策略角色
public interface BaseDiscountStrategy {double preferentialAlgorithm(double money);
}
package pers.junebao.strategy_mode.discount;// 折扣优惠(具体策略角色)
public class Discount implements BaseDiscountStrategy {private double discount;public Discount(double discount) {// Discount(double discount) {if(discount 1)discount 1;else if(discount 0)discount 0.1;this.discount discount;}Overridepublic double preferentialAlgorithm(double money) {return money * this.discount;}
}
package pers.junebao.strategy_mode.discount;// 满减优惠(具体策略角色)
public class FullReduction implements BaseDiscountStrategy {private double discountPrice; //优惠金额private double baseline; // 满减条件FullReduction(double baseline, double price) {this.baseline baseline;this.discountPrice price;}Overridepublic double preferentialAlgorithm(double money) {if(money this.baseline)money - this.discountPrice;return money;}
}
这样环境角色就可以自己决定使用哪种策略而不用修改代码了
package pers.junebao.strategy_mode;import pers.junebao.strategy_mode.discount.BaseDiscountStrategy;
import pers.junebao.strategy_mode.discount.Discount;public class CashRegisterSystem {public static void main(String[] args) {BaseDiscountStrategy ds new Discount(0.9);double purchasingPrice 1500;double amountsPayable ds.preferentialAlgorithm(purchasingPrice);System.out.println(amountsPayable);}
}对于这些具体策略可以使用简单工厂进一步屏蔽策略的具体细节
package pers.junebao.strategy_mode.discount;public class StrategyFactory {public static BaseDiscountStrategy getDiscountStrategy(String name) {BaseDiscountStrategy result null;switch (name){case 九折:{result new Discount(0.9);break;}case 五折: {result new Discount(0.5);break;}case 满100减10: {result new FullReduction(100, 10);break;}case 满1000减200: {result new FullReduction(1000, 200);break;}default:result new OriginalPrice();}return result;}
}
BaseDiscountStrategy ds StrategyFactory.getDiscountStrategy(满1000减200);GitHub | 完整代码