假如你有一个类层次
- class Vehicle
- {
- public:
- virtual void Move() = 0;
- };
- class Car : public Vehicle
- {
- public:
- virtual void Move() { // Car's Move }
- };
- class Boat : public Vehicle
- {
- public:
- virtual void Move() { // Boat's Move }
- }
之后你突然想起交通工具也是可以鸣笛的,于是加了一个虚函数
- class Vehicle
- {
- public:
- virtual void Move() = 0;
- virtual void MakeSound() = 0;
- };
- class Car : public Vehicle
- {
- public:
- virtual void Move() { // Car's Move }
- virtual void MakeSound() { // Car's Sound; }
- };
- class Boat : public Vehicle
- {
- public:
- virtual void Move() { // Boat's Move }
- virtual void MakeSound() { // Boat's Sound }
- }
牵一发而动全身。为基类增加一个行为后需要影响到它所有的子类。所以我们可以把一些变化的行为抽取出来。
- interface IMoveBehavior
- {
- virtual void Move() = 0;
- };
- interface IMakeSoundBehavior
- {
- virtual void MakeSound() = 0;
- };
当基类需要增加新的行为时,可以这样:
- class Vehicle
- {
- public:
- void PerformMove() { mpMoveBehavior->Move(); }
- protected:
- IMoveBehavior* mpMoveBehavior;
- };
对于子类,需要做的是选择合适的MoveBehavior
- class CarMoveBehavior : public IMoveBehavior
- {
- public:
- virtual Move() { // Car's Move }
- };
- class BoatMoveBehavior : public IMoveBehavior
- {
- public:
- virtual Move() { // Boat's Move }
- };
- class Car : public Vehicle
- {
- public:
- Car() { mpMoveBehavior = new CarMoveBehavior; }
- };
- class Boat : public Vehicle
- {
- public:
- Boat() { mpMoveBehavior = new BoatMoveBehavior; }
- };
也可以用同样的方法增加增加MakeSoundBehavior。
设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
设计原则:针对接口编程,而不是针对实现编程。
设计原则:多用 组合,少用继承。
阅读(772) | 评论(0) | 转发(0) |