设计模式太难了?看看这个 “说人话” 的版本再说!
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
*/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);
}
最后:其实这问题最好解决的方法是后台规范状态,而不是通过“显得复杂”的设计模式来解决
以上是关于设计模式太难了?看看这个 “说人话” 的版本再说!的主要内容,如果未能解决你的问题,请参考以下文章
程序员突破内卷大法:聊聊软件架构师成长之路(干货系列,说人话接地气)
恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)
恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)