最近在看设计模式,此文章仅为记录自己读后的理解。
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。设计原则:多用组合,少用继承。
从鸭子应用说起:
某公司准备做一套相当成功得模拟鸭子游戏。游戏会有各种鸭子,可以做各种动作,比如游泳、呱呱叫。此系统设计了一个鸭子类,让各种鸭子继承此类。类结构如下:
各方法都采用虚函数,由子类来继承并实现。 如果要添加鸭子飞行的动作,也写成虚函数的话。会造成不具备飞行的鸭子类也要实现此虚函数,导致代码修改量比较大。为了避免这种情况,我们要找出应用中可能需要变化之处,把他们独立出来进行封装。
有些鸭子有飞行行为,有些鸭子没有飞行行为,就不要去写成虚函数,写成方法,让子类直接继承。但是又要又各种各样的飞行行为,那么我们可以把飞行行为独立出来做成类,在这个飞行类中写虚函数,实现各种飞行动作。 各种鸭子的飞行行为不一样,在具体飞行的时候,我们把各自对应的飞行对象传进去,就可以实现各种鸭子的飞行动作。
鸭子继承Duck类,飞行行为继承FlyBehavior类,呱呱叫继承QuackBehavior类。
最后的设计类结构如下:
根据此模式,实现的C++代码如下:
头文件:
Duck.h
飞行类和呱呱叫类比较简单,子类实现虚数即可。
main函数:
这种模式的好处在于应用层接口统一了,要实现不一样的飞行和呱呱叫,只需要继续添加子类即可。 is-A 换成Has-A.