Skip to content
Low Level Design Mastery Logo
LowLevelDesign Mastery

Dependency

Temporary use - weakest relationship between classes.

Dependency is the weakest relationship where one class uses another temporarily. The dependent class doesn’t store a reference to the other class - it only uses it as a parameter, local variable, or return type.

Dependency represents:

  • “Uses temporarily” relationship
  • No ownership - doesn’t store reference
  • Temporary use - only during method execution
  • Weakest relationship - no coupling beyond method call
  • Temporary use - Only during method execution
  • No storage - Not stored as instance variable
  • Method parameters - Usually passed as parameters
  • Dashed arrow in UML diagrams
dependency_example.py
class Order:
def __init__(self, order_id: str):
self.order_id = order_id
self.total = 0
def calculate_total(self, calculator):
"""Dependency - uses Calculator temporarily"""
# Calculator is passed in, not stored
self.total = calculator.add(100, 50)
return self.total
def print_receipt(self, printer):
"""Dependency - uses Printer temporarily"""
printer.print(f"Order {self.order_id}: ${self.total}")
class Calculator:
def add(self, a, b):
return a + b
class Printer:
def print(self, text):
print(text)
order = Order("ORD-001")
calculator = Calculator()
printer = Printer()
order.calculate_total(calculator) # Uses calculator
order.print_receipt(printer) # Uses printer
# calculator and printer are not stored in order
Diagram
payment_dependency.py
class ShoppingCart:
def __init__(self):
self.items = []
self.total = 0.0
def add_item(self, item: str, price: float):
self.items.append((item, price))
self.total += price
def checkout(self, payment_processor, validator):
"""Dependency - uses PaymentProcessor and Validator temporarily"""
# Validator is used temporarily
if not validator.validate(self.total):
return "Invalid amount"
# PaymentProcessor is used temporarily
result = payment_processor.process(self.total)
return result
class PaymentProcessor:
def process(self, amount: float):
return f"Processing payment of ${amount:.2f}"
class Validator:
def validate(self, amount: float):
return amount > 0
cart = ShoppingCart()
cart.add_item("Laptop", 999.99)
processor = PaymentProcessor()
validator = Validator()
print(cart.checkout(processor, validator)) # Uses both temporarily
FeatureDependencyAssociation
DurationTemporaryPersistent
StorageNot storedStored as reference
LifecycleNo couplingSome coupling
UML SymbolDashed arrowSolid arrow
ExampleOrder uses CalculatorTeacher has Courses

Use Dependency when:

  • Class uses another temporarily
  • Passing objects as method parameters
  • Using objects as local variables
  • You want minimal coupling
  • Relationship is not persistent
  • Objects are created externally

Examples:

  • Order uses Calculator (for calculation)
  • Order uses Printer (to print receipt)
  • ShoppingCart uses PaymentProcessor (to process payment)
  • Report uses Formatter (to format output)
  • Service uses Logger (to log messages)