【Java知识】Java进阶-战略模式实现

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
战略模式(Strategy Pattern)是一种举动计划模式,它界说了一系列算法,并将每一个算法封装起来,使它们可以互换。战略模式使得算法可以独立于使用它的客户端而变化。
紧张脚色


  • 战略接口(Strategy)

    • 这是一个抽象类或接口,界说了全部支持的算法的公共接口。
    • 上下文使用这个接口来调用算法。

  • 详细战略(Concrete Strategy)

    • 实现了战略接口的详细算法。
    • 详细战略类提供了详细的算法实现,并且可以被上下文使用。

  • 上下文(Context)

    • 持有一个战略接口的引用。
    • 客户端通过上下文来调用算法。上下文在运行时可以动态地改变战略对象,从而改变算法。

示例代码

以下是一个简单的战略模式示例,用于计算差别折扣战略下的价格。
  1. // 策略接口
  2. interface DiscountStrategy {
  3.     double calculateDiscount(double price);
  4. }
  5. // 具体策略:无折扣
  6. class NoDiscountStrategy implements DiscountStrategy {
  7.     @Override
  8.     public double calculateDiscount(double price) {
  9.         return price;
  10.     }
  11. }
  12. // 具体策略:百分比折扣
  13. class PercentageDiscountStrategy implements DiscountStrategy {
  14.     private double percentage;
  15.     public PercentageDiscountStrategy(double percentage) {
  16.         this.percentage = percentage;
  17.     }
  18.     @Override
  19.     public double calculateDiscount(double price) {
  20.         return price * (1 - percentage / 100);
  21.     }
  22. }
  23. // 具体策略:固定金额折扣
  24. class FixedAmountDiscountStrategy implements DiscountStrategy {
  25.     private double amount;
  26.     public FixedAmountDiscountStrategy(double amount) {
  27.         this.amount = amount;
  28.     }
  29.     @Override
  30.     public double calculateDiscount(double price) {
  31.         return price - amount;
  32.     }
  33. }
  34. // 上下文
  35. class ShoppingCart {
  36.     private DiscountStrategy discountStrategy;
  37.     public ShoppingCart(DiscountStrategy discountStrategy) {
  38.         this.discountStrategy = discountStrategy;
  39.     }
  40.     public void setDiscountStrategy(DiscountStrategy discountStrategy) {
  41.         this.discountStrategy = discountStrategy;
  42.     }
  43.     public double calculateTotal(double price) {
  44.         return discountStrategy.calculateDiscount(price);
  45.     }
  46. }
  47. // 客户端代码
  48. public class StrategyPatternDemo {
  49.     public static void main(String[] args) {
  50.         double price = 100.0;
  51.         ShoppingCart cart = new ShoppingCart(new NoDiscountStrategy());
  52.         System.out.println("Total price with no discount: " + cart.calculateTotal(price));
  53.         cart.setDiscountStrategy(new PercentageDiscountStrategy(10));
  54.         System.out.println("Total price with 10% discount: " + cart.calculateTotal(price));
  55.         cart.setDiscountStrategy(new FixedAmountDiscountStrategy(15));
  56.         System.out.println("Total price with $15 discount: " + cart.calculateTotal(price));
  57.     }
  58. }
复制代码
长处


  • 算法自由切换:战略模式使得算法可以独立于使用它的客户端而变化。
  • 扩展性好:通过增长新的战略类,可以很容易地扩展系统。
  • 避免多重条件判定:使用战略模式可以避免在客户端代码中使用多重条件判定来选择算法。
缺点


  • 战略类数量增长:当战略数量较多时,会增长类的数量,从而增长系统的复杂性。
  • 客户端需要了解战略:客户端需要知道有哪些战略可供选择,并了解怎样创建和配置这些战略对象。
实用场景



  • 当有多种算法需要实现,并且这些算法可以互换时。
  • 当算法在运行时需要动态地改变时。
  • 当算法的实现需要隐藏,大概算法的实现细节对客户端不可见时。
战略模式是一种非常灵活的计划模式,实用于需要动态选择算法的场景。通过封装算法,战略模式使得算法的变化不会影响到使用它的客户端代码。
相关文献

【知识科普】一篇文章教你学会计划模式

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表