概述
与桥接模式类似,只不过桥接模式是将一个类的部分属性抽离为一个继承体系,再通过组合的方式加入该类中,而策略模式是将一个类的部分方法抽离为一个继承体系,再通过组合的方式加入该类中,例如暑期出行为一个类,出行的方式可能有很多,坐火车或者坐飞机,那么可以将交通方式抽离为一个继承体系,通过接口传入,以适配更灵活的使用场景,并实现类与接口的解耦,符合迪米特原则。
代码实现
class Transportation {
public:
virtual void Transport() = 0;
};
class ByTrain : public Transportation {
public:
void Transport() override { std::cout << "Transport by train." << std::endl; }
};
class ByPlane : public Transportation {
public:
void Transport() override { std::cout << "Transport by plane." << std::endl; }
};
class OnHoliday {
public:
/// other interfaces
void SetTransportation(Transportation *transportation) {
transportation_ = transportation;
}
void GoGoGo() {
std::cout << "Let's Go and we will ";
transportation_->Transport();
}
private:
Transportation *transportation_;
};
int main() {
OnHoliday onHoliday;
Transportation *trans1 = new ByPlane();
Transportation *trans2 = new ByTrain();
onHoliday.SetTransportation(trans1);
onHoliday.GoGoGo();
onHoliday.SetTransportation(trans2);
onHoliday.GoGoGo();
}
在STL中也有类似的使用,但没有使用继承,例如std::sort可以接受第三个参数用来定义比较两个元素的规则。