设计模式之策略模式

今天一个同事遇到一个类的继承问题,问我怎么处理,用C++描述的话,问题差不多是这个样子(我很久不写C++了:D)

上面的代码是说A有四个方法,B继承了A,但是实现了属于自己的3个方法,p函数重用A的实现。现在的问题是:又有一个类C,它的f、g函数都需要重用B的实现,所以理所当然的C继承B,但是C的h函数又需要使用基类A的实现,可以这样:

  

但这样做显然很丑陋,C居然要显示地去调用A的代码,如果再来一个D类,需要用B的f和C的g呢? 策略模式可以解决这个问题,看看它的定义: 

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

这句话可能不太好理解,在上面的例子中,f,g,h,p这些函数可以认为是算法,而A,B,C这些类可以认为是使用这些算法的客户,策略模式就是要把算法独立封装起来,使得算法的改变不需要改变客户类,实现解耦。按照这个思路,把A重新设计如下:

  

现在B类和C类都没有存在的必要了,需要不同的f函数就定义一个f_handler的子类,然后通过set_f接口把子类对象传给A对象,可以动态的改变对象的方法:

  

我们肯定不会把类的每一个方法都封装起来套上一个策略模式,通常我们需要把那些会需要改变的方法提取出来进行封装,所以关键在于在设计一个类的时候,你得知道,哪些方法是最可能改变的,这需要设计师的经验。再帖一下策略模式适用性的官方说明:
    1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
    2.需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[H087],可以使用策略模式。   
    3.算法使用客户不应该知道数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构。
    4.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值