context
从上次确定使用抽象工厂模式, 到最终项目实现,采用了建造者模式. 因为如果使用抽象工厂模式,将每个模块的layout抽象, 会导致产品体系非常复杂, 难以使用和维护.
结构图

说明
GUILayout 是一个由各个模块布局模型组合而成的复杂对象 .
1 | @interface GUILayout : NSObject |
GUIDiaryLayoutModel 日记模块的参数模型,内部包含了图标大小,间距等尺寸信息.其余的XXXLayoutModel均类似GUIDiaryLayoutModel ,只是内部参数根据实际UI控件有差异.其参数参考UI给出的UI文档.
1 | @interface GUIDiaryLayoutModel : NSObject |
LayoutBuilder 建造者父类,拥有一个 GUILayout 对象,并规定了建造不同模块参数的方法.
.h文件
1 | #import <Foundation/Foundation.h> |
.m 文件
1 | #import "LayoutBuilder.h" |
IP4LayoutBuilder , IP5LayoutBuilder ,IP6LayoutBuilder 这些类分别重写父类的建造方法,给不同的XXXLayoutModel赋不同值.
1 |
|
LayoutDirector 规定了LayoutBuilder要执行哪些方法,以及方法的执行顺序,确保最终的GUILayout对象能被顺利初始化.
.h文件
1 | #import <Foundation/Foundation.h> |
.m 文件
1 |
|
因为这个模块的判断方式是屏幕的尺寸,故结合简单工厂模式,将原本属于调用者的判断逻辑下放到了 LayoutDiretor中.
最后,为了调用者使用方便,在整个布局模块的上层包装了一个 GUILayoutManager ,并在其内部为不同模块定义了宏.方便调用
.h
1 | #import <UIKit/UIKit.h> |
.m
1 |
|
便利
如果UI出了新的尺寸,只需要在特定屏幕的的 XXXLayoutBuilder的对应方法中修改参数值即可, 项目中其它文件均无需修改.
例如:
要加大iPhone6 下 ,百科模块的用户头像大小.
IP6LayoutBuilder.m-> configPediaLayout ->configPediaLayout方法中,将model.iconViewWH修改即可.