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的使用就是简单的命令模式。
优点
- 调用者与接受者之间的解耦。
- 易于扩展,扩展命令只需新增具体命令类即可,符合开放闭合原则。
缺点
- 过多的命令会造成过多的类。