摘要:也就是說,封裝了一個自己的對象,而不是和與他平級的共享。但和需求的鏡像顆粒度不同,這樣做的好處是耦合度低,代碼更加分離。對象生成創(chuàng)建的對象時,使用模式。對應的類關系圖其中位于包下,中可以獲取到所有資源的對象構建器。
通過上一篇我們獲得到了經(jīng)過認證的OSClient,通過這個接口,我們就使用openstack4j的所有功能了。但openstack4j是一個用來便于我們更方便調用openstack的sdk,也就是說主要是進行資源請求的處理。在對資源進行操作之前,首先需要生成資源的對象,下面來看看openstack4j中的model設計。(以server來說明)
model對象接口在接口調用時,為了方便業(yè)務處理時的代碼編寫,我們都會用DTO的類來處理我們的請求參數(shù)。在openstack4j中,請求model就在org.openstack4j.model.compute這個包下。但在這里只是接口,具體的實現(xiàn)則是在org.openstack4j.openstack.compute.domain下。
server model的最主要接口是org.openstack4j.model.compute.server,這個接口中包含了server的所有信息。
public interface Server extends ModelEntity { public enum Status {} String getId(); String getName(); Addresses getAddresses(); Image getImage(); }
使用接口而不是直接使用一個DTO類,可以更好兼容因openstack版本變更造成的server property變化。需要注意的是,在Server接口中,getIMage()方法獲取到的IMage接口,并不是鏡像model的接口org.openstack4j.model.image.Image,而是屬于server包下的model.compute.Image。也就是說,server封裝了一個自己的image對象,而不是和與他平級的image共享。表面看起來是有兩個image接口,顯得代碼冗余。但model.compute.server和org.openstack4j.model.image.Image需求的鏡像顆粒度不同,這樣做的好處是耦合度低,代碼更加分離。
Server接口的具體實現(xiàn)類是org.openstack4j.openstack.compute.domain.NovaServer。
model對象生成創(chuàng)建Server的model對象時,使用Builder模式。他的好處是不直接生成想要的對象,而由調用者利用所有必要的參數(shù)來調用構造器。server的model有兩個頂部接口,一個是model.compute.server,一個是model.compute.sverCreate,分別對于server資源的查詢和創(chuàng)建。
serverCreate
ServerCreate server = Builders.server() .name("Ubuntu 2") .flavor("large") .image("imageId") .build();
serverCreate對應的類關系圖:
其中Builders位于org.openstack4j.api包下,Builders中可以獲取到所有資源的對象構建器。由此資源構建器(ServerCreateBuilder)可以構造具體的資源。
這兒設計比較好的是這個構建器,使用了多態(tài)的方式來設計構建器,可以做到很好的可替換性和可擴充性,在程序處理中,也會更加簡化和靈活。
server
model.compute.server的實現(xiàn)比較簡單,只是用于承接openstack server資源查詢的返回值。
有一點可以注意下,NovaServer的內部類Servers,他的唯一方法就是value(),用于返回一個列表類型的NovaServer。這種設計可以在很多好的開源系統(tǒng)里面看得到。對于常用的model類的封裝,可以在其內部類完成,減少代碼冗余,在閱讀上效果也更好。
在model.compute.server接口中,有個枚舉類Status,是server的狀態(tài)枚舉。提這一點是因為我經(jīng)常在項目中看到同事定義枚舉類時會專門定義個enums包,然后將所有的枚舉類都提出來放到這個包下。其實更好的設計是類似openstack4j這樣,對于某個資源的枚舉,最好是作為資源的內部類存在,而不是再多帶帶定義一個ServerStatus的枚舉類。這樣代碼的可讀性和可維護性會更高。
json處理openstack4j的json處理和spring一樣,使用了fasterxml.jackson來進行json的轉換。
@JsonRootName("server") @JsonIgnoreProperties(ignoreUnknown=true) public class NovaServer implements Server { public String id; @JsonProperty("tenant_id") public String tenantId; @JsonProperty("user_id") public String userId; }
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70828.html
摘要:源碼分析之入口背景去年有個整合多個平臺的項目,底層是華為華等不同平臺的環(huán)境,應用管理層為。我們對接華為華等平臺時,對于不同的認證方式,就是使用這種方式,大大減少了開發(fā)量。 openstack4j 源碼分析之入口 背景 去年有個整合多個openstack平臺的項目,底層是華為、華3等不同平臺的openstack環(huán)境,應用管理層為java。雖然各平臺功能與原生openstack有所增加,但...
摘要:以為例構造函數(shù)的內容構造函數(shù)的內部一般會做以下幾個操作各種給內部對象設置屬性。為什么呢源碼做出了解釋。在里面會調用用戶傳入的回調函數(shù)并觸發(fā)事件表示已經(jīng)同步了。整個的源碼事實上就是這兩組東西。 1. 開場 強烈建議一邊看著源碼一邊讀本文章,本文不貼大段代碼。源碼地址。在寫backbone應用的時候,說實話,大部分的時間都是在寫這三個模塊的內容。關于這三個模塊的分析網(wǎng)上隨隨便便就能找到一堆...
1. 開場 1.1 MVC? MVC是一種GUI軟件的一種架構模式。它的目的是將軟件的數(shù)據(jù)層(Model)和視圖(view)分開。Model連接數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)的交互。用戶不能直接和數(shù)據(jù)打交道,而是需要通過操作視圖,然后通過controller對事件作出響應,最后才得以改變數(shù)據(jù)。最后數(shù)據(jù)改變,通過觀察者模式更新view。(所以在這里需要用到設計模式中的觀察者模式) 1.2 Smalltalk-80...
摘要:音樂團隊分享數(shù)據(jù)綁定運行機制分析一個項目搞定所有主流架構單元測試一個項目搞定所有主流架構系列的第二個項目。代碼開源,展示了的用法,以及如何使用進行測試,還有用框架對的進行單元測試。 Android 常用三方框架的學習 Android 常用三方框架的學習 likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,歡迎品嘗 簡單的 MVP 模...
閱讀 685·2023-04-25 22:50
閱讀 1525·2021-10-08 10:05
閱讀 983·2021-09-30 09:47
閱讀 1913·2021-09-28 09:35
閱讀 815·2021-09-26 09:55
閱讀 3405·2021-09-10 10:51
閱讀 3426·2021-09-02 15:15
閱讀 3290·2021-08-05 09:57