项目重构
2016-12-08 本文已影响1979人
maimingliang
前言
最近又开始看设计模式了,这是我第三次看设计模式了,每一次看都会有不同的感觉,不同的收获,真是不同的时间段去看,会有不同的感悟。在大学时候看设计模式,完全不知道为什么这样设计能减少模块与模块间的耦合度,那样设计符合开闭原则,只是知道那样套用而已。随着工作久了,也慢慢的开始了解到其中的一些思想了。
最近写了一个开源项目一行代码实现一些通用的Item布局 ,为什么会有写这个项目?因为在工作的项目,有多个Activity 都有相类似的布局,而且每个布局写这样的Item都有500-600行,维护起来特别的麻烦,由于项目周期的问题,于是匆匆忙忙就封装了一下。后来用着用着item的样式越来越多,导致代码越来越臃肿,最近又出现了新的item样式。于是结合最近对设计模式的一些新感悟,开始重构项目。
项目重构
在重构之前,来看看,这个项目的需求变更过程:
最初的item是这样的:
01.png只有 左边的 图标 和 文字。
然后变成这样的:
这样的:
03.png这样的:
04.png以后有可能右边的带红点的。
11.png确定这些item的可变和不可变的地方:
07.png把不变的抽取出来,把可变的由相应的之类去处理。相应的类图:
08.png父类定义了两个抽象的方法,把可变的地方由子类去处理,然后通过create的方法创建出该itemView。
/**
* 创建出itemview
* @param configAttrs
*/
public void create(ConfigAttrs configAttrs){
setConfigAttrs(configAttrs);
createWidget();
createWidgetLayoutParams();
addWidget();
setLayoutParams();
setIconStyle();
setTextStyle();
}
该方法运用了模版方法模式 来创建 出 ItemView,而ItemView的创建是通过一个ItemFactory 工厂类创建的,相应的类图:
09.png工厂类定义了一个创建Item的方法:
/**
* 创建出ItemView
* @param mode 通过传入 不同mode 来创建出不同类型的itemview
* @param attrs
* @param <T>
* @return
*/
@Override
public <T extends AbstractItem> T createItem(Mode mode, ConfigAttrs attrs) {
Log.e("mode",mode.name());
if(mode == null){
throw new RuntimeException("please set mode");
}
AbstractItem item = null;
try {
if(mode == Mode.NORMAL){
item = new NormalItem(mContext);
}else if(mode == Mode.ARROW){
item = new ArrowItem(mContext);
}else if(mode == Mode.BOTTON){
item = new ButtonItem(mContext);
}else if(mode == Mode.TEXT){
item = new TextItem(mContext);
}
if(item != null){
item.create(attrs); //调用模版方法
}
}catch (Exception e){
throw new RuntimeException(e.getMessage());
}
return (T) item;
}
整个项目的类图:
10.png以上就是最近对设计模式的一些新的了解,对自己之前写的项目进行了重构,如有设计不当,烦请大家多多指导,共同学习。
项目源码
如果觉得对你有用的话,点一下Star赞一下吧!
END.