[scala]Scala 設計模式筆記

1 適配器模式

import java.util.logging.Level
import java.util.logging.Level._

// 適配器model
object Adapter extends App {
  trait Log {
    def warn(msg: String)
    def error(msg: String)
  }

  final class Logger {
    def log(level: Level, message: String) = {}
  }

  implicit class LoggerToLogAdapter(logger: Logger) extends Log {
    def warn(msg: String) = { logger.log(WARNING, msg) }
    def error(msg: String) = { logger.log(INFO, msg) }
  }

  val log = new Logger()

  log.warn("warn")
  log.error("error")
}

2 裝飾模式


// 在以下兩種情況下可以考慮使用裝飾器模式:
// (1)需要在不影響其他對象的情況下,以動態(tài)、透明的方式給對象添加職責。
// (2)如果不適合使用子類來進行擴展的時候,可以考慮使用裝飾器模式。


object Decorator extends App {
  trait OutStream {
    def write(b: Array[Byte])
  }

  class FileOutputStream(path: String) extends OutStream {
    override def write(b: Array[Byte]) = {
      println("do something")
    }
  }

  trait Buffering extends OutStream {
    abstract override def write(b: Array[Byte]) = {
      println("do something before super.write buffering")
      super.write(b)
    }
  }

  new FileOutputStream("hi") .write("hi fileoutput stream".getBytes())

  (new FileOutputStream("hi") with Buffering).write("buffering".getBytes())
}

3 策略模式

object Strategy extends App {
  type Strategy = (Int, Int) => Int
  class Context(s: Strategy) {
    def use(a: Int, b: Int) = s(a, b)
  }

  val add: Strategy = _ + _

  println(new Context(add).use(2, 3))
}

4 責任鏈模式


object Chain extends App {

  case class Event(source: String)
  trait Handler {
    def handle(event: Event)
  }

  class DefaultHandler extends Handler {
    def handle(event: Event) = { println("default handler handle")}
  }

  trait KeyboardHandler extends Handler {
    abstract override def handle(event: Event): Unit = {
      if (event.source == "keyboard") {
        println("keyboard handler handle")
      } else {
        super.handle(event)
      }
    }
  }

  trait MouseHandler extends Handler {
    abstract override def handle(event: Event): Unit = {
      if (event.source == "mouse") {
        println("mouse handler handle")
      } else {
        super.handle(event)
      }
    }
  }

  val handler = new DefaultHandler with KeyboardHandler with MouseHandler

  handler.handle(new Event(source  = "a"))
  handler.handle(new Event(source  = "keyboard"))
  handler.handle(new Event(source  = "mouse"))

}

5 依賴注入模式

object CI extends App {

  case class User()

  trait Repository {
    def save(user: User)
  }

  trait DefaultRepository extends Repository {
    def save(user: User) = {
      println("save user")
    }
  }

  trait UserService { self: Repository =>
    def create(user: User): Unit = {
      save(user)
    }
  }

  (new UserService with DefaultRepository).create(new User)

}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評論 19 139
  • 用途 軟件工程中總會遇到重復出現(xiàn)的問題,某些可復用的成功經(jīng)驗,就可以抽象為模式,在設計方面,就是設計模式。設計模式...
    藍灰_q閱讀 527評論 0 1
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 4,094評論 1 15
  • 設計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數(shù)等等)應該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,082評論 3 14
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,191評論 25 708

友情鏈接更多精彩內(nèi)容