项目重构

作者: 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.

相关文章

  • iOS 基于 MVC 的项目重构总结

    iOS 基于 MVC 的项目重构总结 iOS 基于 MVC 的项目重构总结

  • 项目重构

    前言 好孕帮APP截止到现在已经更新过数十个版本,随着需求的增多和功能的变化,原有的架构已经不再适合现有的业务逻辑...

  • 项目重构

    前言 最近又开始看设计模式了,这是我第三次看设计模式了,每一次看都会有不同的感觉,不同的收获,真是不同的时间段去看...

  • Android 架构设计之项目重构【组件化篇】

    项目演示: 1.组件化重构效果 这里先看下我们重构前后的框架图比较: 重构前: 重构后 ft_xxx表示业务层模块...

  • 我的Android重构之旅:插件化篇

    我的Android重构之旅:架构篇我的Android重构之旅:框架篇我的Android重构之旅:插件化篇 随着项目...

  • 项目重构实践之iOS客户端

    一、项目熟悉 在重构项目之前首先是要对项目的业务和项目架构有一定的熟悉程度才能更好的进行对项目重构的一个实施过程。...

  • android解决ListView加载图片闪烁

    最近负责带领公司项目重构,重构的时候发现项目里面同时在使用两个图片加载框架,andriod-universal-i...

  • 关于项目重构,知道真相的程序员眼泪笑了出来

    其实过完年回来,我们的项目也一直在强调重构,在实践重构中,但是到目前为止,基本没啥进度。关于项目的重构,我说:基本...

  • 架构设计之MVP模式

    这几天思考项目重构的问题,我就啰嗦两句。项目重构说白了就是为controller减负,解耦合。之前项目都是使用mv...

  • 一段代码的重构实践记录

    这篇博客谈一下在实际项目中我们如何执行重构。 首先我们明确一下重构的目标是什么?重构是为了让项目中的代码易懂,易维...

网友评论

  • 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