OCP(开闭原则)与IoC(控制反转)的关联及其他实例咨询
Great question—you’ve already nailed a solid example with the Template Method pattern, so let’s start by formalizing the link between these two concepts, then dive into more instances where they work hand-in-hand.
Core Connection Between OCP and IoC
First, let’s recap the basics to set the stage:
- Open/Closed Principle (OCP) : Software entities (classes, modules, functions) should be open for extension but closed for modification. In short, you should add new functionality without changing existing working code.
- Inversion of Control (IoC) : This shifts control flow and dependency management from a high-level module to external components or abstractions. Instead of the high-level code dictating what low-level implementations to use, it relies on abstractions, and the concrete implementations are provided from outside.
The key overlap? IoC is a tool that enables adherence to OCP. By inverting control, we decouple high-level logic from low-level details, making it easy to extend functionality by swapping in new implementations—without touching the core, unchangeable parts of the system. Your Template Method example perfectly illustrates this: the core algorithm (closed for modification) uses abstract steps that subclasses can extend (open for extension), with control of those steps inverted to the subclasses.
More Examples of Patterns That Combine OCP and IoC
1. Strategy Pattern + Dependency Injection (DI)
The Strategy Pattern encapsulates interchangeable algorithms behind an abstract interface, while DI (a common IoC implementation) injects the concrete strategy into the high-level module.
- OCP Compliance: To add a new algorithm, you only need to create a new class that implements the
Strategyinterface—no changes to the high-level code that uses the strategy. - IoC in Action: The high-level module doesn’t create or hardcode the strategy; it receives the concrete implementation from an external source (like a dependency injector).
Practical Example: A payment processing system. The PaymentService class depends on a PaymentStrategy interface. To add support for Alipay, you create an AlipayStrategy class that implements PaymentStrategy, then inject it into PaymentService—no need to modify the PaymentService logic at all.
2. Observer Pattern
The Observer Pattern lets objects (observers) subscribe to a subject and receive updates when the subject’s state changes.
- OCP Compliance: New observers can be added by implementing the
Observerinterface and registering with the subject—no changes to the subject’s core notification logic. - IoC in Action: The subject doesn’t control the creation or behavior of observers; it only relies on the
Observerabstraction to send updates. Observers take control of how they respond to updates.
Practical Example: A notification system. The NotificationSubject tracks events and notifies all registered observers. To add SMS notifications, you create an SmsObserver class, register it with the subject, and the subject will automatically send updates to it—no edits to the NotificationSubject code.
3. Factory Method Pattern
The Factory Method defines an interface for creating objects, but lets subclasses decide which class to instantiate.
- OCP Compliance: To add a new product type, you create a new concrete factory and product class—no changes to the high-level code that uses the factory interface.
- IoC in Action: The high-level module doesn’t directly create products; it delegates that control to the concrete factory subclasses.
Practical Example: A logging system. The LoggerFactory interface defines a createLogger() method. To add database logging, you implement DatabaseLoggerFactory and DatabaseLogger, then use the new factory to get logger instances—no modifications to the code that uses LoggerFactory.
Wrapping Up
All these patterns leverage IoC to decouple abstractions from concretions, which directly enables OCP. The core idea is always the same: keep your core logic closed to modification, and extend functionality by swapping in new implementations that adhere to existing abstractions.
内容的提问来源于stack exchange,提问作者user10916892

