Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    [Behavioral] State

    Published Apr 22, 2022 [  DesignPattern  ]

    Real world example

    Imagine you are using some drawing application, you choose the paint brush to draw. Now the brush changes its behavior based on the selected color i.e. if you have chosen red color it will draw in red, if blue then it will be in blue etc.

    In plain words

    It lets you change the behavior of a class when the state changes.

    Wikipedia says

    The state pattern is a behavioral software design pattern that implements a state machine in an object-oriented way. With the state pattern, a state machine is implemented by implementing each individual state as a derived class of the state pattern interface, and implementing state transitions by invoking methods defined by the pattern’s superclass. The state pattern can be interpreted as a strategy pattern which is able to switch the current strategy through invocations of methods defined in the pattern’s interface.

    Programmatic example

    Let’s take an example of text editor, it lets you change the state of text that is typed i.e. if you have selected bold, it starts writing in bold, if italic then in italics etc.

    First of all we have our state interface and some state implementations

    interface WritingState {
        write(words: string);
    }
    
    class UpperCase implements WritingState {
        write(words: string) {
            console.log(words.toUpperCase())
        }
    }
    
    class LowerCase implements WritingState {
        write(words: string) {
            console.log(words.toUpperCase())
        }
    }
    
    class DefaultText implements WritingState {
        write(words: string) {
            console.log('default')
        }
    }
    

    Then we have our editor

    // editor
    class TextEditor {
        protected state;
    
        constructor(state: WritingState) {
            this.state = state
        }
    
        setState(state: WritingState) {
            this.state = state
        }
    
        type(words: string) {
            this.state.write(words)
        }
    }
    

    And then it can be used as

    test('test state pattern', () => {
        const editor = new TextEditor(new DefaultText());
    
        editor.type('first line')
    
        editor.setState(new UpperCase())
        editor.type('second line')
        editor.type('third line')
    
        editor.setState(new LowerCase())
        editor.type('Fourth line')
        editor.type('Fifth line')
    })
    

    References