摘要:也就是说,封装了一个自己的对象,而不是和与他平级的共享。但和需求的镜像颗粒度不同,这样做的好处是耦合度低,代码更加分离。对象生成创建的对象时,使用模式。对应的类关系图其中位于包下,中可以获取到所有资源的对象构建器。
通过上一篇我们获得到了经过认证的OSClient,通过这个接口,我们就使用openstack4j的所有功能了。但openstack4j是一个用来便于我们更方便调用openstack的sdk,也就是说主要是进行资源请求的处理。在对资源进行操作之前,首先需要生成资源的对象,下面来看看openstack4j中的model设计。(以server来说明)
model对象接口在接口调用时,为了方便业务处理时的代码编写,我们都会用DTO的类来处理我们的请求参数。在openstack4j中,请求model就在org.openstack4j.model.compute这个包下。但在这里只是接口,具体的实现则是在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接口的具体实现类是org.openstack4j.openstack.compute.domain.NovaServer。
model对象生成创建Server的model对象时,使用Builder模式。他的好处是不直接生成想要的对象,而由调用者利用所有必要的参数来调用构造器。server的model有两个顶部接口,一个是model.compute.server,一个是model.compute.sverCreate,分别对于server资源的查询和创建。
serverCreate
ServerCreate server = Builders.server() .name("Ubuntu 2") .flavor("large") .image("imageId") .build();
serverCreate对应的类关系图:
其中Builders位于org.openstack4j.api包下,Builders中可以获取到所有资源的对象构建器。由此资源构建器(ServerCreateBuilder)可以构造具体的资源。
这儿设计比较好的是这个构建器,使用了多态的方式来设计构建器,可以做到很好的可替换性和可扩充性,在程序处理中,也会更加简化和灵活。
server
model.compute.server的实现比较简单,只是用于承接openstack server资源查询的返回值。
有一点可以注意下,NovaServer的内部类Servers,他的唯一方法就是value(),用于返回一个列表类型的NovaServer。这种设计可以在很多好的开源系统里面看得到。对于常用的model类的封装,可以在其内部类完成,减少代码冗余,在阅读上效果也更好。
在model.compute.server接口中,有个枚举类Status,是server的状态枚举。提这一点是因为我经常在项目中看到同事定义枚举类时会专门定义个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; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70828.html
摘要:源码分析之入口背景去年有个整合多个平台的项目,底层是华为华等不同平台的环境,应用管理层为。我们对接华为华等平台时,对于不同的认证方式,就是使用这种方式,大大减少了开发量。 openstack4j 源码分析之入口 背景 去年有个整合多个openstack平台的项目,底层是华为、华3等不同平台的openstack环境,应用管理层为java。虽然各平台功能与原生openstack有所增加,但...
摘要:以为例构造函数的内容构造函数的内部一般会做以下几个操作各种给内部对象设置属性。为什么呢源码做出了解释。在里面会调用用户传入的回调函数并触发事件表示已经同步了。整个的源码事实上就是这两组东西。 1. 开场 强烈建议一边看着源码一边读本文章,本文不贴大段代码。源码地址。在写backbone应用的时候,说实话,大部分的时间都是在写这三个模块的内容。关于这三个模块的分析网上随随便便就能找到一堆...
1. 开场 1.1 MVC? MVC是一种GUI软件的一种架构模式。它的目的是将软件的数据层(Model)和视图(view)分开。Model连接数据库,实现数据的交互。用户不能直接和数据打交道,而是需要通过操作视图,然后通过controller对事件作出响应,最后才得以改变数据。最后数据改变,通过观察者模式更新view。(所以在这里需要用到设计模式中的观察者模式) 1.2 Smalltalk-80...
摘要:音乐团队分享数据绑定运行机制分析一个项目搞定所有主流架构单元测试一个项目搞定所有主流架构系列的第二个项目。代码开源,展示了的用法,以及如何使用进行测试,还有用框架对的进行单元测试。 Android 常用三方框架的学习 Android 常用三方框架的学习 likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,欢迎品尝 简单的 MVP 模...
阅读 665·2023-04-25 22:50
阅读 1494·2021-10-08 10:05
阅读 954·2021-09-30 09:47
阅读 1833·2021-09-28 09:35
阅读 794·2021-09-26 09:55
阅读 3378·2021-09-10 10:51
阅读 3405·2021-09-02 15:15
阅读 3273·2021-08-05 09:57