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ā)布平臺,僅提供信息存儲服務。