Tuesday, February 9, 2021

Android Command Pattern

 假設現在有三個按鈕, 分別處理三件不相同的事情,

你會怎麼寫?

if(id == event1){
    //處理事件一
} else if(id == event2){
   //處理事件二
} else if(id == event3){
   //處理事件三
}

看起來似乎很直覺對吧?
但是想想未來越來越多事件,
我們的if…else就越來越長,
這樣的設計看起來就是很糟糕XD
另外萬一中間修改一些邏輯判斷,
整段程式碼可能造成邊際效應, 進而產生負面影響。

這邊可以看到處理事件跟事件本身是緊緊綁住的,
所以造成只要發生變化, 則必須整塊程式碼進行大規模的變動,
產生bug的機率就大幅提升。

要改變這種情況, 則必須把事件跟事件處理鬆綁,
該怎麼做呢?
這時候我們就可以使用命令模式來解決這個問題。

1.定义

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录日志,可以提供命令的撤销和恢复功能。

2.介绍

  • 命令模式属于行为型模式。
  • 我们遇到最常见的命令模式就是关机操作了,我们只需点击一下关机按钮就可以了,至于计算机是如何关机的,我们不需要关心其实现细节。

5. 应用场景

  • 需要对行为进行记录,撤销,重做,事务处理时。
  • 对于大多数请求——响应模式的功能,比较适合使用命令模式。

6. 优点

  • 调用者与接受者之间的解藕。
  • 易于扩展,扩展命令只需新增具体命令类即可,符合开放封闭原则。

7. 缺点

  • 过多的命令会造成过多的类。

8. Android中的源码分析

8.1 线程类

实际上Thread的使用就是一个简单的命令模式,先看下Thread的使用:

==========================================================

        new Thread(new Runnable() {
            @Override
            public void run() {
                //doSomeThing
            }
        }).start();
==========================================================

Threadstart()方法即命令的调用者,同时Thread的内部会调用Runnablerun(),这里Thread又充当了具体的命令角色,最后的Runnable则是接受者了,负责最后的功能处理。

8.2 Handler

另一个比较典型的常用到命令模式就是 Handler了,这里就不贴代码了,简单分析下各个类的角色:

  • 接受者:Handler,执行消息的处理操作。
  • 调用者:Looper,调用消息的的处理方法。
  • 命令角色:Message,消息类。
很好解釋

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能