mul14
3/24/2017 - 2:52 PM

Decorator implementation on JavaScript

Adapter pattern implementation on JavaScript

import { EOL } from 'os';

interface LoggerInterface {
  error(message: string): string
  info(message: string): string
}

class Logger implements LoggerInterface {

  adapter = null

  constructor(adapter) {
    this.adapter = adapter
  }

  error(message: string): string {
    return this.adapter.error(message)
  }

  info(message: string): string {
    return this.adapter.info(message)
  }

}

class ShortTimestampLogger implements LoggerInterface {

  logger(message, level = 'INFO') {
    const date = new Date().toDateString()
    return `[${date}] ${level}: ${message}${EOL}`
  }

  error(message: string): string {
    return this.logger(message, 'ERROR')
  }

  info(message: string): string {
    return this.logger(message, 'INFO')
  }

}

class LongTimestampLogger implements LoggerInterface {

  logger(message, level = 'INFO') {
    const date = new Date().toString()
    return `[${date}] ${level}: ${message}${EOL}`
  }

  error(message: string): string {
    return this.logger(message, 'ERROR')
  }

  info(message: string): string {
    return this.logger(message, 'INFO')
  }

}

const shorterLogger = new Logger(new ShortTimestampLogger)
shorterLogger.info('This message use short timestamp.')

const longLogger = new Logger(new LongTimestampLogger)
shorterLogger.info('This message use long timestamp.')
class Storage {
  constructor(storage) {
    this.storage = storage
  }

  put(key, value) {
    this.storage.put(key, value)
  }

  get(key) {
    this.storage.get(key)
  }
}


class LocalStorage {
  static put(key, value) {
    localStorage.setItem(key, value)
    console.log('put', key, value)
  }

  static get(key) {
    localStorage.getItem(key)
    console.log('get', value)
  }
}


class Cookie {
  static put(key, value) {
    console.log('put', key, value)
  }

  static get(key) {
    console.log('get', value)
  }
}


class Redis {
  static put(key, value) {
    console.log('put', key, value)
  }

  static get(key) {
    console.log('get', value)
  }
}


const storage = new Storage(LocalStorage)

storage.put('lang', 'id')

storage.get('lang') // Output: id