Scala設計模式
Design Patterns in Scala一文列舉了Java和Scala實現經典GoF設計模式的不同程式碼,有助於對比兩種語言。
工廠模式:
Java程式碼:
Scala的程式碼:
注意Scala使用了trait替代Java介面,使用Object替代Java的Class。
Lazy initialization懶初始化
懶初始化是懶賦值lazy evaluation的一種特殊實現。
Java程式碼:
Scala程式碼:
Scala引入了lazy語法。
單態Singleton
Java程式碼:
Scala程式碼:
object語法其實是一個單例物件。
Adapter介面卡
Java程式碼:
Scala程式碼:
Scala使用了語法implicit,隱式語法,它不是全域性變數,也不是trait那樣動態注入,隱藏魔法吧,在因果論中因有兩種形式,顯式因和隱式因,隱式因是無法顯式看到的,所以new Logger還是之前原始類名,但是其實已經被調包。
Decorator介面卡
Scala程式碼:
trait語法很適合進行方法攔截或新增。
工廠模式:
Java程式碼:
public interface Animal {} private class Dog implements Animal {} private class Cat implements Animal {} public class AnimalFactory { public static Animal createAnimal(String kind) { if ("cat".equals(kind)) return new Cat(); if ("dog".equals(kind)) return new Dog(); throw new IllegalArgumentException(); } } AnimalFactory.createAnimal("dog"); <p class="indent"> |
Scala的程式碼:
trait Animal private class Dog extends Animal private class Cat extends Animal object Animal { def apply(kind: String) = kind match { case "dog" => new Dog() case "cat" => new Cat() } } Animal("dog") <p class="indent"> |
注意Scala使用了trait替代Java介面,使用Object替代Java的Class。
Lazy initialization懶初始化
懶初始化是懶賦值lazy evaluation的一種特殊實現。
Java程式碼:
private volatile Component component; public Component getComponent() { Component result = component; if (result == null) { synchronized(this) { result = component; if (result == null) { component = result = new Component(); } } } return result; } <p class="indent"> |
Scala程式碼:
lazy val x = { print("(computing x) ") 42 } print("x = ") println(x) <p class="indent"> |
Scala引入了lazy語法。
單態Singleton
Java程式碼:
public class Cat implements Runnable { private static final Cat instance = new Cat(); private Cat() {} public void run() { // do nothing } public static Cat getInstance() { return instance; } } Cat.getInstance().run() <p class="indent"> |
Scala程式碼:
object Cat extends Runnable { def run() { // do nothing } } Cat.run() <p class="indent"> |
object語法其實是一個單例物件。
Adapter介面卡
Java程式碼:
public interface Log { void warning(String message); void error(String message); } public final class Logger { void log(Level level, String message) { /* ... */ } } public class LoggerToLogAdapter implements Log { private final Logger logger; public LoggerToLogAdapter(Logger logger) { this.logger = logger; } public void warning(String message) { logger.log(WARNING, message); } public void error(String message) { logger.log(ERROR, message); } } Log log = new LoggerToLogAdapter(new Logger()); <p class="indent"> |
Scala程式碼:
trait Log { def warning(message: String) def error(message: String) } final class Logger { def log(level: Level, message: String) { /* ... */ } } implicit class LoggerToLogAdapter(logger: Logger) extends Log { def warning(message: String) { logger.log(WARNING, message) } def error(message: String) { logger.log(ERROR, message) } } val log: Log = new Logger() <p class="indent"> |
Scala使用了語法implicit,隱式語法,它不是全域性變數,也不是trait那樣動態注入,隱藏魔法吧,在因果論中因有兩種形式,顯式因和隱式因,隱式因是無法顯式看到的,所以new Logger還是之前原始類名,但是其實已經被調包。
Decorator介面卡
public interface OutputStream { void write(byte b); void write(byte[] b); } public class FileOutputStream implements OutputStream { /* ... */ } public abstract class OutputStreamDecorator implements OutputStream { protected final OutputStream delegate; protected OutputStreamDecorator(OutputStream delegate) { this.delegate = delegate; } public void write(byte b) { delegate.write(b); } public void write(byte[] b) { delegate.write(b); } } public class BufferedOutputStream extends OutputStreamDecorator { public BufferedOutputStream(OutputStream delegate) { super(delegate); } public void write(byte b) { // ... delegate.write(buffer) } } new BufferedOutputStream(new FileOutputStream("foo.txt")) <p class="indent"> |
Scala程式碼:
trait OutputStream { def write(b: Byte) def write(b: Array[Byte]) } class FileOutputStream(path: String) extends OutputStream { /* ... */ } trait Buffering extends OutputStream { abstract override def write(b: Byte) { // ... super.write(buffer) } } new FileOutputStream("foo.txt") with Buffering <p class="indent"> |
trait語法很適合進行方法攔截或新增。
相關文章
- Scala 與設計模式(一):Singleton 單例模式設計模式單例
- Scala 與設計模式(五):Adapter 介面卡模式設計模式APT
- Scala 簡介 [摘自 Scala程式設計 ]程式設計
- Scala的物件導向程式設計物件程式設計
- 聊聊 scala 的模式匹配模式
- Scala模式匹配詳解模式
- 設計模式(四)Singleton設計模式設計模式
- 設計模式----工廠設計模式設計模式
- Java設計模式——模板設計模式Java設計模式
- 設計模式-工廠設計模式設計模式
- scala模式匹配詳細解析模式
- 設計模式之單例設計模式設計模式單例
- 【設計模式】設計模式(一)-- 大話設計模式讀書筆記設計模式筆記
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- restapi(3)- MongoDBEngine : MongoDB Scala程式設計工具庫RESTAPIMongoDB程式設計
- 設計模式----中介模式設計模式
- 設計模式-中介模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-代理模式設計模式
- 設計模式-策略模式設計模式
- 設計模式-模板模式設計模式
- 設計模式——模板模式設計模式
- 設計模式----代理模式設計模式
- 設計模式~代理模式設計模式
- 【設計模式】代理模式設計模式
- 設計模式——策略模式設計模式
- 設計模式——代理模式設計模式
- 一.設計模式之工廠設計模式設計模式
- 設計模式總結 —— 單例設計模式設計模式單例
- JavaScript設計模式初探--單例設計模式JavaScript設計模式單例
- JavaScript設計模式之建立型設計模式JavaScript設計模式
- 23種設計模式(八)-原型設計模式設計模式原型
- 23種設計模式(二)---策略設計模式設計模式
- 一起學Scala 模式匹配模式
- Yii2設計模式——設計模式簡介設計模式
- Java設計模式系列之單例設計模式Java設計模式單例
- 淺識JAVA設計模式——單例設計模式Java設計模式單例
- JAVA設計模式之 13.命令設計模式Java設計模式
- 《Head First 設計模式》:與設計模式相處設計模式