代码实例模式辨析:Bridge Pattern与Strategy Pattern如何区分?
这段代码属于策略模式(Strategy Pattern),而非桥接模式(Bridge Pattern)
为什么是策略模式?
这段代码的核心是把驾驶行为(Drive)封装成独立的策略类(NormalDriveStrategy、SportsDriveStrategy),Vehicle类通过依赖注入持有不同的策略实例,子类(GoodsVehicle、SportVehicle等)在初始化时选择对应的驾驶策略。策略模式的本质就是让行为可以独立于使用它的对象灵活替换,这里完全符合这个意图——不同车辆只是切换驾驶行为的实现,没有对车辆本身的核心抽象和另一个维度的实现做分离。
为什么不是桥接模式?
桥接模式的核心是分离抽象层和实现层,让两者可以各自独立扩展,它解决的是多维度变化的问题:
- 抽象层要有自己的层级(比如不同类型的Vehicle:Car、Truck)
- 实现层也要有自己的层级(比如不同的动力系统:FuelEngine、ElectricEngine)
- 抽象层依赖实现层的接口,两者都能独立新增子类,互不影响
而你的代码里,只有**行为(驾驶策略)**这一个可变维度,没有另一个独立的实现层级。IDriveStrategy只是Vehicle的一个行为,不是Vehicle的“实现”维度——桥接模式里的实现层是用来完成抽象层核心功能的,而非单纯的行为替换。比如如果再加一个IPowerSystem接口(燃油、电动),Vehicle同时依赖IDriveStrategy和IPowerSystem,那才可能用到桥接模式。
简单总结:策略模式管单一行为的灵活替换,桥接模式管多维度的抽象与实现分离扩展。
原始代码示例
public interface IDriveStrategy { void Drive(); } public class NormalDriveStrategy : IDriveStrategy { public void Drive(){ } } public class SportsDriveStrategy : IDriveStrategy { public void Drive(){ } } public class Vehicle { private readonly IDriveStrategy _driveStrategy; public Vehicle(IDriveStrategy driveStrategy) { _driveStrategy = driveStrategy; } public void Engine(){ } public void Display(){ } public void PerformDrive() { _driveStrategy.Drive(); } } public class GoodsVehicle : Vehicle { public GoodsVehicle() : base(new NormalDriveStrategy()) { } } public class SportVehicle : Vehicle { public SportVehicle() : base(new SportsDriveStrategy()) { } } public class OffRoadVehicle : Vehicle { public OffRoadVehicle() : base(new SportsDriveStrategy()) { } }
内容的提问来源于stack exchange,提问作者rohan
相关产品推荐
相关产品推荐

