浏览代码

add facade pattern

MrOzOn 4 年之前
父节点
当前提交
666ebbbfc8
共有 2 个文件被更改,包括 99 次插入0 次删除
  1. 23 0
      src/structural_patterns/README.MD
  2. 76 0
      src/structural_patterns/facade/main.kt

+ 23 - 0
src/structural_patterns/README.MD

@@ -110,3 +110,26 @@ _+_
 _-_
 - декоратор и его компонент не идентичны. Декоратор действует как прозрачное обрамление. Но декорированный компонент все же не идентичен исходному.
 - множество мелких объектов. При использовании в проекте этого паттерна нередко формируется система, составленная из большого числа мелких объектов, похожих друг на друга. Такие объекты различаются только способом взаимосвязи, а не классом и не значениями своих внутренних переменных. Хотя такие системы легко настраиваются проектировщиком, хорошо разбирающимся в их строении, изучать и отлаживать их очень тяжело.
+
+# [Фасад (Facade)](./facade/main.kt)
+
+Это структурный паттерн проектирования, который предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.
+
+Предоставляет унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. _Фасад_ определяет интерфейс более высокого уровня, который упрощает использование подсистемы.
+
+## Применимость
+
+- предоставление простого интерфейса к сложной подсистеме
+- многочисленные зависимости между клиентами и классами реализации абстракции
+- требуется разложить подсистему на отдельные уровни
+
+## Отношения
+
+Клиенты общаются с подсистемой, посылая запросы фасаду. Он переадресует их подходящим объектам внутри подсистемы. Хотя основную работу выполняют именно объекты подсистемы, фасаду, возможно, придется преобразовать свой интерфейс в интерфейсы подсистемы.
+
+## Результаты
+
+- он изолирует клиентов от компонентов подсистемы, уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, и упрощая работу с подсистемой
+- позволяет ослабить связанность между подсистемой и ее клиентами. Зачастую компоненты подсистемы сильно связаны. Слабая связанность позволяет видоизменять компоненты, не затрагивая при этом клиентов
+- фасад не препятствует приложениям напрямую обращаться к классам подсистемы, если это необходимо. Таким образом, у вас есть выбор между простотой и общностью.
+

+ 76 - 0
src/structural_patterns/facade/main.kt

@@ -0,0 +1,76 @@
+package structural_patterns.facade
+
+// Mock type for imitation complext class, in this case File
+typealias MockFile = String
+
+class VideoFile(filename: String) {
+    init {
+        println("read file \"$filename\" into memory")
+    }
+}
+
+open class CompressionCodec
+
+class MPEG4CompressionCodec: CompressionCodec() {
+    //different realization video codec
+    init {
+        println("initialize settings for MPEG4 codec")
+    }
+    override fun toString(): String = "MPEG4CompressionCodec"
+}
+
+class OggCompressionCodec: CompressionCodec() {
+    //different realization video codec
+    init {
+        println("initialize settings for OGG codec")
+    }
+    override fun toString(): String = "OggCompressionCodec"
+}
+
+class CodecFactory {
+    companion object {
+        // emulate any work
+        fun extract(file: Any):Any {
+            println("analyze file, get current video codec")
+            return file
+        }
+    }
+}
+
+class BitrateReader {
+    companion object {
+        fun read(file: String, sourceCodec: Any): ByteArray {
+            println("decoding file, return raw stream")
+            return "bla-bla".encodeToByteArray()
+        }
+        fun convert(buffer: ByteArray, destinationCodec: CompressionCodec): MockFile {
+            println("convert stream using $destinationCodec, save to file")
+            return "Bingo!"
+        }
+    }
+}
+
+// It's facade
+interface IVideoConverter {
+    fun convert(filename: String, format: String): MockFile
+}
+
+class VideoConverter: IVideoConverter {
+    override fun convert(filename: String, format: String): MockFile {
+        val file = VideoFile(filename)
+        val sourceCodec = CodecFactory.extract(file)
+        val destinationCodec = if(format=="mp4") {
+            MPEG4CompressionCodec()
+        } else {
+            OggCompressionCodec()
+        }
+        val buffer = BitrateReader.read(filename, sourceCodec)
+        return BitrateReader.convert(buffer, destinationCodec)
+    }
+}
+
+fun main(){
+    val convertor = VideoConverter()
+    val mp4File = convertor.convert("my_favorite_film.ogg", "mp4")
+    println("done!")
+}