设计模式不是针对语言的,而是针对OO编程的(所以不管你是学Java还是C++或者其他面向OOP语言),设计模式是在总结中得到的。不是发明设计模式,而是发现。
(1) 多用组合,少用继承。 (2) 针对接口编程,而不是针对实现编程。 (3) 策略模式:定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
Java有接口说法,而在C++中则没有。一般说接口,那就是指示一个C++抽象类。
接下来看《Head First设计模式》中策略模式之鸭子。 UML类图
代码实现
#include <iostream> class FlyBehavior { public: virtual void fly() = 0; }; class FlyWithWings : public FlyBehavior { public: void fly() { std::cout << "I'm flying!" << std::endl; } }; class FlyNoWay : public FlyBehavior { public: void fly() { std::cout << "I cann't fly!" << std::endl; } }; class QuackBehavior { public: virtual void quack() = 0; }; class Quack : public QuackBehavior { public: void quack() { std::cout << "Quack ..." << std::endl; } }; class Squeak : public QuackBehavior { public: void quack() { std::cout << "Squeak ..." << std::endl; } }; class MuteQuack : public QuackBehavior { public: void quack() { std::cout << "Mutequack ..." << std::endl; } }; class Duck { protected: FlyBehavior *flyBehavior; QuackBehavior *quackBehavior; virtual ~Duck() { delete flyBehavior; delete quackBehavior; } public: void performQuack() { quackBehavior->quack(); } void performFly() { flyBehavior->fly(); } void setFlyBehavior(FlyBehavior *f) { flyBehavior = f; } void setQuackBehavior(QuackBehavior *q) { quackBehavior = q; } }; class MallardDuck : public Duck { public: MallardDuck() : Duck() { flyBehavior = new FlyWithWings; quackBehavior = new Quack; } void dispaly() { std::cout << "I'm a real mallard duck!" << std::endl; } };《Head Fist设计模式》,美Freeman ,中国电力出版社,2007/09/01 设计模式精解-GoF 23 种设计模式解析附 C++实现源码