添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

典型问题:想要为个别子类添加fly动作,直接添加在父类会导致对个别子类出现多余的修改。继承关系的写死导致软件难以应对变化,改动父类牵一发而动全身,容易违反开闭原则。

不论子类重写父类方法,还是提取父类接口由子类实现,子类之间重复的代码都不方便复用,修改代价大。

使用设计模式是希望软件在不断面对变化时的修改代价尽可能小。

原则:分离变化/不变的部分

我们希望系统中的某部分改变不会影响其他部分。所以需要将变化的部分与不变的部分隔离开。

在本例中,即将变化的部分抽取新的类,对新的类使用组合关系,以代替原来的继承重写的关系。Duck类中的大部分信息趋于稳定,但Fly动作一直在变,因此只将Fly的部分抽象出一个虚类,Duck仍然具体实现。

classDiagram
        fly()
    class FlyWithWings {
        fly()
    class FlyNoWay {
        fly() do nothing

原则:针对接口编程,而不是针对实现

针对实现:动作在父类实现,子类进行重写;或者子类继承接口,动作在子类中实现。

针对接口:动作的实现不绑定于父类。利用多态针对超类型编程,例如针对抽象类或接口编程,执行时根据实际情况指定真正的行为。

针对接口编程使得原来的类、提取出的接口可以各自独立变化,作为两个生命周期去发展,在彼此需要时进行注入。

模式:策略模式

参考上述过程。

解释:从一批可以相互替换的策略中抽象出一个抽象策略,使用者包含该抽象策略,以便随时替换具体的策略。

比如,duck类的实例有很多不同的飞行行为,我们将飞行行为委托给FlyBehavior超类实现,提取出的这个行为类相当于一个算法族,即采取策略模式。duck使用该算法族的实例,可以灵活地指定采用哪个算法。

原则:多用组合,少用继承

duck使用该算法族的实例,即组合关系,可以对算法实现setter以便动态更换算法。相比于继承关系的静态实现(写死),组合关系更加灵活。

经验:使用设计模式