平時代碼中用不到設計模式?Are you kidding me?


引子

平時我是個反應非常慢的人。有多慢呢?大概是兩年前有次團隊內部開會時,我聽到同學說平時代碼中用不到設計模式,我當時沒有回答。兩年后我終於反應過來了:“Are you kidding me?我每天都在用!”

 

應用場景

建造者模式

寫一個接口,入參是一大堆,什么都有。這是長期積累下來的代碼,參數都提供給外部用了。只能做加法,不能做減法。這時候接口就這樣了,內部能不能好看點呢?

可以啊,重構,留殼摳瓤啊!

 

這一堆參數可以封裝成一個有意義的類,再往下傳遞處理。這時候就用到了建造者模式,對參數進行封裝。構造一個靜態builder函數,將參數傳進去,返回是一個對象。

例子如下:

這是構造一個“人”的對象。builder函數建議放到“人”這個對象里,因為這樣從領域上來說更合理更清晰。

@Data
@Accessors(chain = true)
public class Person {
    private String name;
    private int armCount=2;//胳膊數默認為2
    private int legCount=2;//腿數默認為2

    private Person(String name) {
        this.name = name;
    }

    public static Person builder(String name) {
        return new Person(name);
    }
}

適配器模式

大家現在用mysql都喜歡用mybatis-generator工具自動生成部分代碼。里面的對象一般稱為領域對象。在上層給用戶返回結果的時候一般不直接用。因為信息太多了。比如數據庫中固定結構的字段:創建時間、更新時間、是否為邏輯刪除列這些,更好的一個方式是對外不可見。這時候就要對領域對象和傳輸層對象之間做一個轉換,這時候用到適配器模式。

 

下面是使用BeanUtils將對象之間做適配的例子:

  private static QuotaResponse toQuotaResponse(Quota quota) {
        QuotaResponse quotaResponse = new QuotaResponse();
        BeanUtils.copyProperties(quota, quotaResponse);
        return quotaResponse;
    }

觀察者模式

數據庫設計時常用的一種表結構設計方式是子母表。比如可以為“人”設計一張數據表。軍人、工程師、特工有各自不同的屬性,它們是“人”這張數據表的關聯子表。為了展示時候的效率,將這些子母表展開,另外做一張展示表。

在寫一個定時任務時,如果掃描到“人”的狀態狀態更新了。比如“人”的胳膊數變了,這時候可以通知這些展示表,狀態都更新了。

 

舉個例子:

因為九頭蛇在街頭橫行,見人就砍,出現了一些殘疾人。神盾局特工Fitz(菲茲)正在研制一種肢體再生技術,這個技術完成將會是包括人在內的所有動物的福音。因此,人類醫院和動物醫院都作為觀察者都訂閱了Fitz的項目狀態。一旦完成,這些醫院都會得到通知。

定義醫院作為觀察者的通用接口

public interface Observer {
    void update(boolean isFinish);
}

Fitz開放了一個attach方法,任何單位都可以實現Observer接口后通過這個方法被加入通知列表,一旦完成,Fiz將通知所有觀察者:

public class Fitz {
    private List<Observer> observers = new ArrayList<Observer>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void finish() {
        notifyAllObservers();
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update(true);
        }
    }
}

總結

代入思考,技術提升的關鍵

 

推薦閱讀

「前任的50種死法」開發踩坑案例--慢就是錯

一個請求過來都經過了什么?(2017年http版)

測測你是《花千骨》里的誰-業務代碼里常用的設計模式

 

關於作者

一線開發十二年,有日本東京和美國硅谷研發經驗。有百余項技術發明專利,目前任美團點評技術專家。有自己的技術公眾號「編程一生」。如果您在閱讀文章時有什么疑問或者發現文章的錯誤,歡迎在公眾號里給我留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM