Example code from Head First Design Patterns second edition translated to python to help me understand and memorise the patterns.
I have added examples of pattern usage in the Python standard library and pypi - I am starting to see patterns everywhere!
Note I am aiming for a mostly literal translation whilst trying to make the code a little more pythonic by, e.g. using python conventions for
ClassNames
andmethod_names
and putting all of the code in a single file where it makes sense to do so.
- Strategy
- Observer
- Decorator
- Factory Method
- Simple Factory
- Abstract Factory
- Builder(Bonus Pattern)
- Singleton
- Command
- Adapter
- Façade
- Template Method
- Iterator
- Composite
- State
- Proxy
- Model View Controller (MVC)
- Manager(Bonus Pattern)
- Result(Bonus Pattern)
From the book 📖:
packageheadfirst.designpatterns.strategy; publicabstractclassDuck { FlyBehaviorflyBehavior; QuackBehaviorquackBehavior; publicDuck() { } publicvoidsetFlyBehavior(FlyBehaviorfb) { flyBehavior = fb; } publicvoidsetQuackBehavior(QuackBehaviorqb) { quackBehavior = qb; } abstractvoiddisplay(); publicvoidperformFly() { flyBehavior.fly(); } publicvoidperformQuack() { quackBehavior.quack(); } publicvoidswim() { System.out.println("All ducks float, even decoys!"); } }
From this repository :
classDuck(): _fly_behavior=None_quack_behavior=Nonedefset_fly_behavior(self, fly_behavior): self._fly_behavior=fly_behaviordefset_quack_behavior(self, quack_behavior): self._quack_behavior=quack_behaviordefdisplay(self): raiseNotImplementedErrordefperform_fly(self): self._fly_behavior.fly() defperform_quack(self): self._quack_behavior.quack() defswim(self): print("All ducks float, even decoys! 〰🦆〰")
- Encapsulate what varies
- Open-Closed Principle: Open for extension, closed for modification
- Program to an interface, not to an implementation
- Favour composition over inheritence
- Dependency Inversion Principle
- Depend upon abstractions
- The Hollywood Principle : "Don't call us, we'll call you"
- One Class, One Responsibility Principle
- Single Responsibility Principle
- Principle of Least Knowledge
I started to work on the MVC pattern here but have a small complete MVC implementation in JavaScript in another repo.