设计模式(一)策略模式

策略模式

OO设计

刚刚学习完基础的OO设计时,经常喜欢写一个超类,然后用一些子类去继承它,在不同的子类中扩展或修改方法。当子类比较少,且方法大多相同时,这种针对实现编程的方式看起来没有太大的问题。

但如果有超过10个子类呢?100个呢?很容易发现,当子类逐渐增多时,一个方法会存在许多种不同的实现,而某些实现在一组子类中又是相同的,甚至会发现有些实现不应该出现在某些子类中!

例如:鸭子超类有许多子类,其中包含真的鸭子和假的鸭子,显然大部分假的鸭子并不会叫,也不会游,而真的鸭子几乎都能完成这两个动作。

很自然地,面对上述问题,应该从超类中抽取这些方法,将他们设计为接口。但不应该单纯地让鸭子子类们实现这些接口,因为这并没有太大的意义,在每个子类中仍然要去编写一些重复的代码。

策略模式

策略模式将满足上述情况的每组方法定义为算法簇,在每个算法簇中,元素都是类似但不同的子类,他们实现同一个超类接口。拥有了每个行为的算法簇之后,我们可以将每个算法簇的超类接口存储在我们设计的超类中,然后再设计一个调用该接口方法的方法即可。这样一来,子类不再需要实现这些行为的方法,只需要存储算法簇中不同的算法实现即可。这节省了大量的重复代码的修改。

初次以外,这些算法簇有更强的扩展性,其他类也可以存储这些接口变量,来使他们的子类能够完成这些行为。

例如:猎人为了猎鸭,设计了一种能发出鸭子叫声的“鸭鸣器“。显然鸭鸣器要能够发出鸭子的叫声,因此可以把发出叫声作为一个算法簇,在其中实现不同的鸭子叫声(也包含不会叫)。

设计原则

在策略模式中,可以总结以下几点设计原则:

  1. 将应用中变化的内容干净地抽取出来,使变化和不需要变化的代码相互独立。
  2. 针对接口编程,而非针对实现编程。
  3. 多用组合,少用继承。

注:这里组合指将多个类结合在一起,而不像继承一样把许多类绑定在同一个超类上。

posted @ 2020-04-07 20:04  Aries99C  阅读(135)  评论(0)    收藏  举报