在这样的需求下用设计模式,我真的太难了
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
*/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
*/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);
}
最后:其实这问题最好解决的方法是后台规范状态,而不是通过“显得复杂”的设计模式来解决
以上是关于在这样的需求下用设计模式,我真的太难了的主要内容,如果未能解决你的问题,请参考以下文章