项目重构

作者: maimingliang | 来源:发表于2016-12-08 16:39 被阅读1979次

    前言

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

    最近写了一个开源项目一行代码实现一些通用的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.

    相关文章

      网友评论

      • swartz:求怎样大白式转移到eclipse?
      • jokermoon:item 背景色可以更换么,已提issue
        maimingliang:@jokermoon item 背景色确实是没有暴露api出来。
      • 梦华芳秋:这的确是个好东西,无论是实用性还是从封装的角度来看!
        梦华芳秋:大神,我想问下啊,在itemFactory中根据Mode判断创建不同的item,要是写成用动态代理的话,该怎么写呢?就是不管外面写的是啥,库都是可以不改动的?谢谢!
        maimingliang:@梦华芳秋 谢谢:blush:
      • jebysun:这个需求的确常见,好多时候只是组合控件实现。博主提供了另一个思路。另外,想知道博主的UML类图是什么软件画的?
        maimingliang:谢谢 :blush: ,我用的StarUML
        f7ea2720c392: @jebysun 同问
      • 27c7534af0e9:已看完,为什么不直接写个自定义view,这样代码去布局不是很繁琐吗?
        maimingliang:@NNJ 如果用xml布局,要写几百行的布局文件。维护起来很麻烦,所以就封装了一下。:joy::joy:
        27c7534af0e9: @maimingliang 嗯呢,我的意思是用xml布局那样自定义view,不用java代码去建布局
        maimingliang:@NNJ 这就是自定义view啊。我只是用设计模式的思想重构了一下。

      本文标题:项目重构

      本文链接:https://www.haomeiwen.com/subject/cbormttx.html