设计模式太难了?看看这个 “说人话” 的版本再说!

Posted 我爱程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式太难了?看看这个 “说人话” 的版本再说!相关的知识,希望对你有一定的参考价值。

大家好,我是头条菌。

我爱程序员!我的微信号:toutiaoio007,欢迎加我好友,拉你入群~


设计模式是反复出现问题的解决方案,是如何解决某些问题的指导方针。

拿「简单工厂模式」来说,看看维基百科怎么说?

在面向对象编程 (OOP) 中,工厂是用于创建其他对象的对象 - 正式工厂是一种函数或方法,它从一些方法调用返回变化的原型或类的对象,这被假定为 “新”。

好的,简单点说?

简单工厂只是为客户端生成一个实例,而不会向客户端公开任何实例化逻辑。

还差点意思?看个现实世界的例子:

考虑一下,你正在建房子,你需要门。你可以穿上你的木匠衣服,带上一些木头,胶水,钉子和建造门所需的所有工具,然后开始在你的房子里建造它,或者你可以简单地打电话给工厂并把内置的门送到你这里,不需要了解关于制门的任何信息或处理制作它所带来的混乱。


头条菌要推荐的这个 “说人话” 的版本,就是 “超简单地解释设计模式”!

看目录!

创建型设计模式

  • 简单工厂模式 (Simple Factory)

  • 工厂方法模式 (Factory Method)

  • 抽象工厂模式 (Abstract Factory)

  • 构建器模式

  • 原型模式 (Prototype)

  • 单例模式 (Singleton)

  • 结构型设计模式

  • 适配器模式 (Adapter)

  • 桥梁模式 (Bridge)

  • 组合模式 (Composite)

  • 装饰模式 (Decorator)

  • 门面模式 (Facade)

  • 享元模式 (Flyweight)

  • 代理模式 (Proxy)

  • 行为型设计模式

  • 责任链模式 (Chain Of Responsibilities)

  • 命令行模式 (Command)

  • 迭代器模式 (Iterator)

  • 中介者模式 (Mediator)

  • 备忘录模式 (Memento)

  • 观察者模式 (Observer)

  • 访问者模式 (Visitor)

  • 策略模式 (Strategy)

  • 状态模式 (State)

  • 模板方法模式 (Template Method)


  • 项目地址https://github.com/guanguans/design-patterns-for-humans-cn


    头条菌加入的社交圈子,来吧!

    在这样的需求下用设计模式,我真的太难了

    项目情景

    后台返回一个stauts的状态码给我,我根据这个stauts来展示不同的状态文字。

    这么简单的展示,需要用到设计模式吗?当然可以不用设计模式也能解决。一千个读者一千个哈姆雷特吧。也是用了这个设计模式只是自己觉得自己的代码厉害了而已。

    之前的文章也对做过一些介绍。只是自己没有用到过项目。今天正好用到了。

    为什么会想到用设计模式呢

    代码实现功能的方式很多种,就看你比较中意哪一种。如果这方法是你熟悉的,你可以直接拿来用。如果一个你不熟悉的方法,但是又能够解决问题,你会选择吗?

    小菜鸟会选择这个不熟悉的方法。当然如果在项目很紧张的情况,我会直接copy去解决问题,不会花什么时间去思考。直接cv就可以解决了吧。

    如果我有时间去思考,去优化自己的代码,就可以用一种只要花费少量时间,又能解决需求的办法。那不是进步和任务完成两全其美吗?

    后台返回的状态

    后台返回的status是一个int。按理说只要根据if else就能解决的问题啊?但是后台传给我返回的不同的status来表示相同的状态。下面就是后台返回的对应

    状态(0:审核中,1:审核完成,)

    状态0:审核完成;1:审批中

    拿到这个需求,我只能说我太难了。

    需求解析

    拿到这个问题。我是这样想的。我的理解是根据status有一个展示的行为。但是两种状态码的不同,造成了这个行为的实现有不同。这样我就想到了策略模式。

    关于,我就不做介绍了。之前的文章有做过学习的笔记。

    我的需求实现

    • 基础策略的构造 构造一个策略的接口。通过status改变TextView的属性

    /**
     * @author Stone
     * @version V1.0
     * @description: 一个状态的策略
     * @date 2020-01-09 22:04
     * @email 
     */public interface BaseStatusStrategy {    /**
         * 展示状态
         * @param status
         * @param view
         * @param context
         * @return
         */
        void showStatus(double status, TextView view, Context context);
    }
    • 实现不同的策略

    后台只写了两种不同的状态,我实现两个就可以了

    /**
     * @author Stone
     * @version V1.0
     * @description: 0:审核,1:审核完成
     * @date 2020-01-09 22:32
     * @email 
     */public class WayOneStautsStrategy implements BaseStatusStrategy{    @Override
        public void showStatus(double status, TextView view, Context context) {

            String s = "审核中";       

            if (status == 1) {


                s = "审核完成";
            } 
            view.setText(s);
        }
    }
    /**

    * @description:0:审核完成;1:审批中

     @author  Stone


    * @date 2020-01-09 22:41
    * @version V1.0
    */public class WayOtherStautsStrategy implements BaseStatusStrategy{    @Override
        public void showStatus(double status, TextView view, Context context) {

            String s = "审核完成";       

             if (status == 1) {

                s = "审批中";
                view.setEnabled(false);
            } 
            view.setText(s);
        }

    }

    模式的调用

    因为展示TextView的数据,我是在RecycleView的Adapter中执行的。所有我的Adapter中应该持有一个策略的父类。并在Adapter初始化的时候,初始化我的策略类。

    private BaseStatusStrategy mStrategy;

        public ListAdapter(RecyclerView recyclerView) {
            super(recyclerView, R.layout.item_list);
            mStrategy = new WayOneStautsStrategy();
        }

        public void setStrategy(BaseStatusStrategy strategy) {
            mStrategy = strategy;
        }

    由于多态的原因,调用的时候只调用一行代码就可以解决了.

    if (mStrategy != null) {

        mStrategy.showStatus(type, helper.getView(getResId(mContext,"tv_content_" + count, "id")),
                mContext);
    }

    最后:其实这问题最好解决的方法是后台规范状态,而不是通过“显得复杂”的设计模式来解决

    以上是关于设计模式太难了?看看这个 “说人话” 的版本再说!的主要内容,如果未能解决你的问题,请参考以下文章

    程序员突破内卷大法:聊聊软件架构师成长之路(干货系列,说人话接地气)

    GWAS分析-说人话(1)啥是GWAS,都分析啥?

    恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)

    恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)

    恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)

    恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)