设计模式-行为型设计模式

//本文参考菜鸟教程
设计模式主要分为三大类创建型模式,结构型模式,行为型模式,本文主要讲行为型模式
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

1.策略模式

定义:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

interface Strategy{
    fun operation(num:Int,num2:Int):Int
}

class AddStrategyImpl:Strategy{
    override fun operation(num: Int, num2: Int) = num + num2
}

class RemoveStrategyImpl:Strategy{
    override fun operation(num: Int, num2: Int) = num - num2
}

class StrategyImpl(private var strategy: Strategy){
    fun doStrategy(num: Int,num2: Int){
        strategy.operation(num,num2)
    }
}

2.模版模式
定义:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现

abstract class Temple {
    abstract fun one()

    abstract fun two()

    abstract fun three()

    fun dayDo() {
        one()
        two()
        three()
    }
}

class TempleTest : Temple() {
    override fun one() {
        println("1")
    }

    override fun two() {
        println("2")
    }

    override fun three() {
        println("3")
    }
}

3.观察者模式
定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

interface Subject{
   fun registerObserver(o:Observer)
   fun removeObserver(o:Observer)
   fun notifyObserver()
}

interface Observer{
    fun update(message:String)
}

class WechatServer:Subject{

    var list = mutableListOf<Observer>()

    var message:String = ""

    override fun registerObserver(o: Observer) {
        list.add(o)
    }

    override fun removeObserver(o: Observer) {
        if(list.isNotEmpty()){
            list.remove(o)
        }
    }

    override fun notifyObserver() {
         list.forEach {
             it.update(message)
         }
    }

    fun setInfo(){
        println("观测者")
        message = "粗发事件"
        notifyObserver()
    }

}
 class ObserverUser(val name:String):Observer{
     private var message: String = ""

     override fun update(message: String) {
         this.message = message
         readMessage()
     }

     fun readMessage(){
         println("获取到消息")
     }
 }

fun main() {
    val server = WechatServer()
    val userLi = ObserverUser("li")
    server.registerObserver(userLi)
    server.setInfo()
}

4.迭代器模式
定义:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示
参考java的iterator
5.责任链模式
定义:如果有多个对象有机会处理请求,责任链可使请求的发送者和接受者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

abstract class AbstractLogger {
    companion object {
        val INFO = 1
        val DEBUG = 2
        val ERROR = 3
    }

    private var level: Int = 0

    var nextLogger: AbstractLogger? = null

    fun logMessage(level: Int, message: String) {
        if (this.level <= level) {
            write(message)
        }
        nextLogger?.logMessage(level, message)
    }

    protected abstract fun write(message: String)
}

class ConsoleLogger(level: Int) : AbstractLogger() {
    override fun write(message: String) {
        println("stand console::logger$message")
    }
}

class ErrorLogger(level: Int) : AbstractLogger() {
    override fun write(message: String) {
        println("error console::logger$message")
    }
}

class FileLogger(level: Int) : AbstractLogger() {
    override fun write(message: String) {
        println("File console::logger$message")
    }
}

object ChainTest {
    fun getChainOfLoggers(): AbstractLogger {
        val errorLogger: AbstractLogger = ErrorLogger(AbstractLogger.ERROR)
        val fileLogger: AbstractLogger = FileLogger(AbstractLogger.DEBUG)
        val consoleLogger: AbstractLogger = ConsoleLogger(AbstractLogger.INFO)
        errorLogger.nextLogger = fileLogger
        fileLogger.nextLogger = consoleLogger
        return errorLogger
    }
}

fun main() {
    val loggerChain: AbstractLogger = getChainOfLoggers()
    loggerChain.logMessage(AbstractLogger.INFO, "This is an information.")

    loggerChain.logMessage(
        AbstractLogger.DEBUG,
        "This is a debug level information."
    )

    loggerChain.logMessage(
        AbstractLogger.ERROR,
        "This is an error information."
    )
}

6.命令模式
定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

interface Order{
    fun execute()
}

class Stock{
    val name = "ABC"

    val quantity = 10

    fun buy(){
        println("bubbly")
    }

    fun sell(){
        println("sell")
    }
}

class SellStock(private val stock: Stock):Order{
    override fun execute() {
        stock.sell()
    }
}

class BuyStock(private val stock: Stock):Order{
    override fun execute() {
        stock.buy()
    }
}

class Broker {
    private val orderList: MutableList<Order> = ArrayList()
    fun takeOrder(order: Order) {
        orderList.add(order)
    }

    fun placeOrders() {
        for (order in orderList) {
            order.execute()
        }
        orderList.clear()
    }
}

fun main() {
    val abcStock = Stock()
    val buyStockOrder = BuyStock(abcStock)
    val sellStockOrder = SellStock(abcStock)
    val broker = Broker()
    broker.takeOrder(buyStockOrder)
    broker.takeOrder(sellStockOrder)
    broker.placeOrders()
}

7.状态模式
定义:在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

data class StateContext(var state: State? = null)

interface State{
    fun doAction(context: StateContext)
}

class StartState:State{
    override fun doAction(context: StateContext) {
        println("is start state")

       context.state = this
    }

    override fun toString(): String {
        return "Start state"
    }
}

class StopState:State{
    override fun doAction(context: StateContext) {
        println("is stop state")
        context.state = this
    }

    override fun toString(): String {
        return "stop state"
    }
}

fun main() {
    val context = StateContext()
    val startState = StartState()
    startState.doAction(context)
    println(context.state.toString())
    val stopState = StopState()
    stopState.doAction(context)
    println(context.state.toString())
}

8.备忘录模式
定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式


data class MementoTest(var state:String)

class Originator{
    var state:String = ""

    fun saveStateToMemento():MementoTest = MementoTest(state)

    fun getStateFromMemento(mementoTest: MementoTest){
        state = mementoTest.state
    }
}

class CareTaker {
    private val mementoList: MutableList<MementoTest> = ArrayList<MementoTest>()
    fun add(state: MementoTest) {
        mementoList.add(state)
    }

    operator fun get(index: Int): MementoTest {
        return mementoList[index]
    }
}

fun main() {
    val originator = Originator()
    val careTaker = CareTaker()
    originator.state = "State #1"
    originator.state = "State #2"
    careTaker.add(originator.saveStateToMemento())
    originator.state = "State #3"
    careTaker.add(originator.saveStateToMemento())
    originator.state = "State #4"
    println("Current State: " + originator.state)
    originator.getStateFromMemento(careTaker[0])
    println("First saved State: " + originator.state)
    originator.getStateFromMemento(careTaker[1])
    println("Second saved State: " + originator.state)
}

9.访问者模式
定义:我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

class VisitorTest {
    interface ComputerPart{
        fun accept(computerPartVisitor: ComputerPartVisitor)
    }

    interface ComputerPartVisitor {
        fun visit(computer: Computer?)
        fun visit(mouse: Mouse?)
        fun visit(keyboard: Keyboard?)
        fun visit(monitor: Monitor?)
    }


    class Keyboard:ComputerPart{
        override fun accept(computerPartVisitor: ComputerPartVisitor) {
            computerPartVisitor.visit(this)
        }
    }

    class Mouse:ComputerPart{
        override fun accept(computerPartVisitor: ComputerPartVisitor) {
            computerPartVisitor.visit(this)
        }
    }

    class Monitor:ComputerPart{
        override fun accept(computerPartVisitor: ComputerPartVisitor) {
            computerPartVisitor.visit(this)
        }
    }

    class Computer : ComputerPart {
        private var parts: Array<ComputerPart> = arrayOf(Mouse(), Keyboard(), Monitor())
        override fun accept(computerPartVisitor: ComputerPartVisitor) {
            for (i in parts.indices) {
                parts[i].accept(computerPartVisitor)
            }
            computerPartVisitor.visit(this)
        }
    }

    class ComputerPartDisplayVisitor : ComputerPartVisitor {
        override fun visit(computer: Computer?) {
            println("Displaying Computer.")
        }

        override fun visit(mouse: Mouse?) {
            println("Displaying Mouse.")
        }

        override fun visit(keyboard: Keyboard?) {
            println("Displaying Keyboard.")
        }

        override fun visit(monitor: Monitor?) {
            println("Displaying Monitor.")
        }
    }
}

fun main() {
    val computer: ComputerPart = VisitorTest.Computer()
    computer.accept(ComputerPartDisplayVisitor())
}

10.中介者模式
定义:是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

class MediatorTest {
    object ChatRoom {
        fun showMessage(user: User, message: String) {
            println(
                Date().toString()
                    .toString() + " [" + user.name + "] : " + message
            )
        }
    }

    class User(var name: String) {
        fun sendMessage(message: String) {
                ChatRoom.showMessage(this, message)
        }
    }
}

fun main() {
    val robert = User("Robert")
    val john = User("John")
    robert.sendMessage("Hi! John!")
    john.sendMessage("Hello! Robert!")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容