收藏设计模式

Android设计模式:命令模式

2022-01-18  本文已影响0人  搬码人

命令模式

简介:通过command抽象命令类,将不符合抽象编程的handler,转为抽象编程。

背景

购物商城的应用首页模块有不同的榜单推送,而不同的榜单的结构又各式各样,也就是说没有统一的接口。直接请求的依赖性太强,Handler类的改变,需要修改ListView


image.png

设计实现

1、执行对象Handler没有抽象接口,ListView直接使用Handler耦合性太大。
2、增加一个Command层,抽象出一个Command接口,由子类包括Handler实体。
3、ListView对Command接口编程,选择调用command子类,从而调用不同的请求。


命令模式

代码实例

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
class HotHandler {
    fun getHots():String{
        println("返回热门商品列表")
        return "热门商品列表"
    }
}
class NewerHandler {
    fun getNews():String{
        println("返回最新商品列表")
        return "最新商品列表"
    }
}
class DiscountHandler {
    fun getDiscounts():String{
        println("返回优惠商品列表")
        return "优惠商品列表"
    }

}
abstract class Command {
    abstract fun execute():String
}
class HotCommand:Command() {
    private val handler = HotHandler()
    override fun execute(): String {
        return handler.getHots()
    }
}
class DiscountCommand:Command() {
    private val handler = DiscountHandler()
    override fun execute(): String {
        return handler.getDiscounts()
    }
}
class NewerCommand:Command() {
    private val handler = NewerHandler()
    override fun execute(): String {
        return handler.getNews()
    }
}
class ListView {
    //为功能键注入命令
    lateinit var command:Command
    //请求列表
    fun getList(){
        println("首页请求")
        val result = command.execute()
        println("当前列表${result}")
    }
}

测试

class CommandClient {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            val command1 = HotCommand()
            val command2 = DiscountCommand()
            val command3 = NewerCommand()
            val listView = ListView().apply {
                this.command = command3
                this.getList()
            }
        }
    }
}

测试结果


image.png
image.png

应用场景

1、需要对行为进行记录、撤销、重做、事务处理时。
2、对于大多数请求——响应模式的功能,比较适合使用命令模式。
在Android中的应用:实际上Thread的使用就是简单的命令模式。

优点

缺点

上一篇 下一篇

猜你喜欢

热点阅读