安卓自定义VIEWandroid 项目开发Android

项目重构

2016-12-08  本文已影响1979人  maimingliang

前言

最近又开始看设计模式了,这是我第三次看设计模式了,每一次看都会有不同的感觉,不同的收获,真是不同的时间段去看,会有不同的感悟。在大学时候看设计模式,完全不知道为什么这样设计能减少模块与模块间的耦合度,那样设计符合开闭原则,只是知道那样套用而已。随着工作久了,也慢慢的开始了解到其中的一些思想了。

最近写了一个开源项目一行代码实现一些通用的Item布局 ,为什么会有写这个项目?因为在工作的项目,有多个Activity 都有相类似的布局,而且每个布局写这样的Item都有500-600行,维护起来特别的麻烦,由于项目周期的问题,于是匆匆忙忙就封装了一下。后来用着用着item的样式越来越多,导致代码越来越臃肿,最近又出现了新的item样式。于是结合最近对设计模式的一些新感悟,开始重构项目。

项目重构

在重构之前,来看看,这个项目的需求变更过程:

最初的item是这样的:

01.png

只有 左边的 图标 和 文字。
然后变成这样的:

02.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.

上一篇下一篇

猜你喜欢

热点阅读