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

Posted JAVA大数据架构师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在这样的需求下用设计模式,我真的太难了相关的知识,希望对你有一定的参考价值。

项目情景

后台返回一个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);
}

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

以上是关于在这样的需求下用设计模式,我真的太难了的主要内容,如果未能解决你的问题,请参考以下文章

将 Linux 移植到 M1 Mac 真的太难了!

在微服务架构中做机器学习,真的太难了

java线程真的太难了!!!

C++,真的太难了

测试老人还要跟874万应届生抢工作,真的太难了

2019年互联网寒冬,企业大裁员,我们太难了