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
修改即可.