瀏覽代碼

add bridge pattern

MrOzOn 4 年之前
父節點
當前提交
368b5aa511

+ 24 - 0
src/structural_patterns/README.MD

@@ -35,3 +35,27 @@
 - адаптирует адаптируемый класс (Adaptee) к целе (Target), перепоручая действия конкретному классу Adaptee. Поэтому данный паттерн не будет работать, если мы захотим одновременно адаптировать класс и его подклассы
 - позволяет адаптеру (Adapter) заместить некоторые операции адаптируемого класса Adaptee, так как Adapter есть не что иное, как подкласс Adaptee
 - вводит только один новый объект. Чтобы добраться до адаптируемого класса, не нужно никакого дополнительного обращения по указателю
+
+# [Мост (Bridge)](./bridge/main.kt)
+
+Это структурный паттерн проектирования, который разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.
+
+## Другое название
+Описатель/Тело (Handle/Body)
+
+## Применимость
+
+- требуется избежать постоянной привязки абстракции к реализации
+- и абстракции, и реализации должны расширяться новыми подклассами
+- изменения в реализации абстракции не должны отражаться на клиентах
+- число классов стремительно разрастается
+
+## Отношения
+
+Объект абстракции перенаправляет запросы клиента своему объекту реализации.
+
+## Результаты
+
+- отделение реализации от интерфейса
+- повышение степени расширяемости
+- сокрытие деталей реализации от клиентов

+ 48 - 0
src/structural_patterns/bridge/Remote.kt

@@ -0,0 +1,48 @@
+package structural_patterns.bridge
+
+// This is BRIDGE between concrete remote and concrete device
+open class Remote(private val device:Device) {
+
+    fun togglePower() {
+        if (device.isEnabled()) {
+            device.disable()
+            println("$device disable")
+        }
+        else {
+            device.enable()
+            println("$device enable")
+        }
+    }
+    fun volumeDown() {
+        if (device.getVolume()>=10) {
+            device.setVolume(device.getVolume() - 10)
+            println("$device set volume = ${device.getVolume()}")
+        }
+    }
+    fun volumeUp() {
+        if (device.getVolume()<90) {
+            device.setVolume(device.getVolume() + 10)
+            println("$device set volume = ${device.getVolume()}")
+        }
+    }
+    fun channelDown() {
+        if (device.getChannel()>1) {
+            device.setChannel(device.getChannel() - 1)
+            println("$device set channel = ${device.getChannel()}")
+        }
+    }
+    fun channelUp() {
+        device.setChannel(device.getChannel() + 1)
+        println("$device set channel = ${device.getChannel()}")
+    }
+}
+
+interface Device {
+    fun isEnabled():Boolean
+    fun enable()
+    fun disable()
+    fun getVolume(): Int
+    fun setVolume(_volume: Int)
+    fun getChannel(): Int
+    fun setChannel(_channel: Int)
+}

+ 75 - 0
src/structural_patterns/bridge/SpecificDevices.kt

@@ -0,0 +1,75 @@
+package structural_patterns.bridge
+
+class Tv: Device {
+
+    private var powerOff = true
+    private var volume = 50
+    private var channel = 1
+
+    override fun toString(): String = "Tv"
+
+    override fun isEnabled(): Boolean {
+        return !powerOff
+    }
+
+    override fun enable() {
+        powerOff = false
+    }
+
+    override fun disable() {
+        powerOff = true
+    }
+
+    override fun getVolume(): Int {
+        return volume
+    }
+
+    override fun setVolume(_volume: Int) {
+        volume = _volume
+    }
+
+    override fun getChannel(): Int {
+        return channel
+    }
+
+    override fun setChannel(_channel: Int) {
+        channel = _channel
+    }
+}
+
+class Radio: Device {
+
+    private var powerOff = true
+    private var volume = 20
+    private var channel = 10
+
+    override fun toString(): String = "Radio"
+
+    override fun isEnabled(): Boolean {
+        return !powerOff
+    }
+
+    override fun enable() {
+        powerOff = false
+    }
+
+    override fun disable() {
+        powerOff = true
+    }
+
+    override fun getVolume(): Int {
+        return volume
+    }
+
+    override fun setVolume(_volume: Int) {
+        volume = _volume
+    }
+
+    override fun getChannel(): Int {
+        return channel
+    }
+
+    override fun setChannel(_channel: Int) {
+        channel = _channel
+    }
+}

+ 8 - 0
src/structural_patterns/bridge/SpecificRemote.kt

@@ -0,0 +1,8 @@
+package structural_patterns.bridge
+
+class AdvancedRemote(private  val device: Device): Remote(device) {
+    fun mute() {
+        device.setVolume(0)
+        println("$device set volume = 0")
+    }
+}

+ 26 - 0
src/structural_patterns/bridge/main.kt

@@ -0,0 +1,26 @@
+package structural_patterns.bridge
+
+fun main(){
+    val tv = Tv()
+    var remote = Remote(tv)
+    remote.togglePower()
+    remote.volumeUp()
+    remote.volumeUp()
+    remote.volumeDown()
+    remote.channelDown()
+    remote.channelDown()
+    remote.togglePower()
+
+    val radio = Radio()
+    remote = Remote(radio)
+    remote.togglePower()
+    remote.volumeUp()
+    remote.volumeUp()
+    remote.volumeDown()
+    remote.channelDown()
+    remote.channelDown()
+    remote.togglePower()
+
+    val advancedRemote = AdvancedRemote(radio)
+    advancedRemote.mute()
+}