Visitor Pattern
Behavioral Design Pattern
Github: https://github.com/FrancescoXX/Design-Patterns-Visitor-Javascript
đź“ŚIntroduction
Visitor is a simple behavioral design pattern.
It gives a way to easily separate an algorithm from an object structure.
It is also useful to visit complex objects structures.
⚡️In short
Allows adding new functions, without modifying existing classes.
We create a visitor class/function, that implements the specializations of the virtual function.
The visitor takes the instance reference as input, and implements the goal through double dispatch.
đź’ˇIntent
Separate algorithms from the objects on which they operate.
🔧 Apply (when we want to)
- Visit complex objects structure (inheritance)
- Perform operations based upon concrete classes
- Avoid pollution of concrete classes with many different operations
- Have the ability to easily define new operations, without changing concrete classes
âś…Pro
- Open/Closed Principle (software entities should be open for extension, but closed for modification).
- Separates operations that don't belong together.
- Accumulate state: Visitors can mantain state across the hierarchy
⚠️Cons
- Breaks encapsulation
- Adding new concrete elements is hard
- Requires a new method for all concrete visistors
- Rely on the interface of the concrete element (might lack the access to the object's private fields)
🏆 Great for
- Visit complex object structure
- Change existing object without breaking the current structure
- Centralize logic
/** Visitor Pattern
*
*/
class Sayan {
constructor(name, power) {
this.name = name
this.power = power
this.getPowerLevel = () => this.power;
this.setPowerLevel = (power) => this.power = power;
this.acceptVisitor = (functionVisitor) => functionVisitor(this);
}
}
const goku = new Sayan("Goku", 100);
console.log(goku.getPowerLevel()); //100
//Define a Visitor Function
const Empower = (sayan) => sayan.setPowerLevel(sayan.getPowerLevel() * 100);
//Substitute the new function to the Mage object
goku.acceptVisitor(Empower);
//Now check the new power!
console.log(goku.getPowerLevel()); //10000 It's Over 9000!
Github: https://github.com/FrancescoXX/Design-Patterns-Visitor-Javascript