@startuml
package com.iluwatar.pipeline {
  class App {
    + App()
    + main(args : String[]) {static}
  }
  ~class ConvertToCharArrayHandler {
    - LOGGER : Logger {static}
    ~ ConvertToCharArrayHandler()
    + process(input : String) : char[]
  }
  ~interface Handler<I, O> {
    + process(I) : O {abstract}
  }
  ~class Pipeline<I, O> {
    - currentHandler : Handler<I, O>
    ~ Pipeline<I, O>(currentHandler : Handler<I, O>)
    ~ addHandler(newHandler : Handler<O, K>) : Pipeline<I, K>
    ~ execute(input : I) : O
  }
  ~class RemoveAlphabetsHandler {
    - LOGGER : Logger {static}
    ~ RemoveAlphabetsHandler()
    + process(input : String) : String
  }
  ~class RemoveDigitsHandler {
    - LOGGER : Logger {static}
    ~ RemoveDigitsHandler()
    + process(input : String) : String
  }
}
Pipeline -->  "-currentHandler" Handler
ConvertToCharArrayHandler ..|> Handler 
RemoveAlphabetsHandler ..|> Handler 
RemoveDigitsHandler ..|> Handler 
@enduml