策略模式的扩展

/*第二章行为参数化2.2模板方法模式2.2.2

在2.2模板方法模式中,插入本节。直接用Sum为例,不需要搞新例子。*/

在Sum设计中,需要注意的问题是:抽象方法item(intx) 有无穷多或者足够多的实现方式;而且存在2个抽象方法的组合

--------------------------------------------------------

道生一,一生二,二生三,三生万物。多次使用策略模式需要考虑两个问题:组合爆炸和无限可能。

单纯地使用如Netbeans的重构-提取接口是不够的,我们需要将提取的接口由父类型(is_a)修改成使用关系。

 

1. 避免类型爆炸

 

抽象类型Sum(或Context)有两个抽象方法——next()与item (),如果两个抽象方法分别有m和n种实现,则Sum因为方法实现的任意组合,将导致它可以有m*n个子类型。也就是说,方法实现的任意组合将导致Sum的子类型数量急剧膨胀。

为了避免类型(数量)的爆炸,需要对Sum进行如下步骤的重构。

(1)以INext和IItem分别封装next ()和item ()。显然,不可设计如下Sum的类层次,

public abstract class Sum implements INext, IItem

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来并且使它们之间可以相互替换。策略模式让算法独立于使用它们的客户端而变化。 策略模式的实现通常包括以下几个角色: 1. 环境类:它持有一个策略接口的引用,并在需要时调用策略接口的方法。 2. 抽象策略类:它定义了一个公共接口,用于所有具体策略类实现。 3. 具体策略类:它实现了抽象策略类定义的接口,提供具体的算法实现。 策略模式的优点是,它提供了一种灵活的方式来切换算法,而不需要更改客户端代码。另外,由于每个具体的策略都被封装在一个独立的类中,因此可以方便地进行单元测试和维护。 下面是一个使用策略模式的简单示例: 假设我们正在开发一个商场收银系统,该系统需要根据不同的优惠策略来计算商品的价格。我们可以使用策略模式来实现这个功能。 首先,我们定义一个抽象的优惠策略接口: ``` public interface DiscountStrategy { double calculateDiscount(double price); } ``` 然后,我们定义不同的具体优惠策略类: ``` public class NoDiscountStrategy implements DiscountStrategy { @Override public double calculateDiscount(double price) { return price; } } public class TenPercentDiscountStrategy implements DiscountStrategy { @Override public double calculateDiscount(double price) { return price * 0.9; } } public class TwentyPercentDiscountStrategy implements DiscountStrategy { @Override public double calculateDiscount(double price) { return price * 0.8; } } ``` 最后,我们定义一个环境类,它持有一个优惠策略接口的引用,并在需要时调用策略接口的方法: ``` public class Cashier { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double calculatePrice(double price) { return discountStrategy.calculateDiscount(price); } } ``` 现在,我们可以根据不同的优惠策略来创建不同的具体策略类,并将它们注入到 Cashier 对象中,实现不同的优惠计算。 ``` Cashier cashier = new Cashier(); cashier.setDiscountStrategy(new NoDiscountStrategy()); double price1 = cashier.calculatePrice(100); // 100.0 cashier.setDiscountStrategy(new TenPercentDiscountStrategy()); double price2 = cashier.calculatePrice(100); // 90.0 cashier.setDiscountStrategy(new TwentyPercentDiscountStrategy()); double price3 = cashier.calculatePrice(100); // 80.0 ``` 通过使用策略模式,我们可以避免使用大量的 if-else 或 switch-case 语句来实现不同的算法,从而使我们的代码更加简洁、清晰、易于维护和扩展

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值