一个解耦良好的计时控件,可自由扩展。
来源:互联网 发布:淘宝企业信息公示审核 编辑:程序博客网 时间:2024/05/18 11:26
TimerView
世上本没有解耦,需求改的多了也便有了解耦。 —— 产品经理
本例将通过一个计时控件,聊聊如何解耦~
本TimerView
仅作为demo
,不保证其健壮性,请勿在实际项目中使用。
特点
UI 容器
与计时逻辑
分离UI 容器
与具体 UI 布局
分离
Let's Go
话说,小明在做一个电商项目,有个倒计时需求。
需求 1.0
要求"时、分、秒"数字显示。
这个简单,小明很快自定义了一个TimerView
:
public class TimerView { TextView tvHour, tvMinute, tvSecond; TextView divider1, divider2; ...}
需求 2.0
界面太丑啦,加点颜色和背景吧~
这个也简单,小明很快加了一些自定义属性:
public class TimerView { TextView tvHour, tvMinute, tvSecond; TextView divider1, divider2; // 添加 自定义属性 int tvHourBgRes, tvMinuteBgRes, tvSecondBgRes; int tvHourColor, tvMinuteColor, tvSecondColor; ...}
需求 3.0
这时,产品经理又跑了过来,你看我发现了啥~
发现一套火焰数字.jpg,好炫酷的说,帮忙改上去吧~
小明内心:你 TM 有病啊!!!
你发现了么,这下小明把自己带到沟里了。新需求要求显示火焰数字图片
(ImageView)。
然而,由于TimerView
由TextView
构成,再怎么自定义属性也实现不了新需求(ImageView)了。
说的就是你呀:https://github.com/iwgang/CountdownView
分析
为啥会这样呢?因为一开始就设计紧耦合了。TimerView
依赖了具体子类TextView
,功能也就被局限在TextView
了。
那我们只需这么调整一下,把TextView
改成更抽象的View
。
这样一来tvHour
既可以是TextView
,也可以是ImageView
,或者某个ViewGroup
,功能得以拓展:
public class TimerView { //TextView tvHour, tvMinute, tvSecond; View tvHour, tvMinute, tvSecond; //TextView divider1, divider2; View divider1, divider2; // 自定义属性也不用了,因为无法确定 tvHour 这些究竟是啥子类。 //int tvHourBgRes, tvMinuteBgRes, tvSecondBgRes; //int tvHourColor, tvMinuteColor, tvSecondColor; ...}
这也体现了软件设计的一大原则:要依赖抽象(View)而不要依赖具体(TextView)。
依赖注入
还有一个问题:tvHour
究竟是啥呢,这个得由用户决定。
通常我们会提供一系列setXXX()
方法给用户进行设置。这个套路叫做依赖注入。
依赖注入是解耦的一种常见的方式。通常,当你有无法确定的一些东西,都应该抛给用户决定。
举个例子,View
被点击时,设计者不知道你想干嘛,于是设计了View.setOnClickListener()
。这是典型的依赖注入。
好了,ImageView
可以支持了,然而对于界面更新ImageView
和TextView
肯定是不一样的。
该怎么更新又无法确定了,我们可以再次用依赖注入
的方式解耦,把难题抛给用户。
因此,我设计了类似Adapter
的东西,都在代码里,就不详细展开了。
需求 4.0
嗨呀~还不够啊,产品经理的脑洞总是很大的。
产品经理:我看到一个 svg 诶~
小明:算我倒霉。不过,我早就重构解耦过了。改需求, 小 case~
需求 5.0
产品经理:小明,你还活着那?我发现机械表更好看诶~
小明: **, 我改就是了
感谢
https://github.com/lypeer/GoogleClock
https://github.com/gnehsuy/ClockView
- 一个解耦良好的计时控件,可自由扩展。
- RDVTabBarController--可自由定制的iOS底部导航控件
- RDVTabBarController--可自由定制的iOS底部导航控件
- 一个可扩展的php验证类
- Retrofit--创建一个可扩展的客户端
- Winform窗体可自由移动用户控件
- 自由拖动的控件
- RDVTabBarController--可自由定制的iOS底部导航控件的使用总结
- CList的扩展CGridListEx,可排序的grid表格控件
- 养成一个良好的习惯
- 让你的Winform应用在运行时可自由拖放控件位置
- 让你的Winform应用在运行时可自由拖放控件位置
- 可自由配置的图文混排控件——组合法
- 做一个可编辑的表格控件
- 做一个可编辑的表格控件
- 做一个可编辑的表格控件
- 做一个可编辑的表格控件
- 做一个可编辑的表格控件
- 视频动作识别--Towards Good Practices for Very Deep Two-Stream ConvNets
- Solr6.6在Windows(Centos6)上的安装与配置 (一)
- BCG与阿里研究院等联合揭秘中国互联网经济:成功的关键是什么?
- C3P0连接池使用
- Spring xml文件中dubbo相关标签不能被识别的问题
- 一个解耦良好的计时控件,可自由扩展。
- 用 AI 怼黑产是一种怎样的体验?
- 瀚高数据库(HGDB 3.1.4)常用管理命令
- android home键流程分析
- C#/VB.NET 如何旋转PDF页面
- 可直接嵌入业务系统为终端客户提供分析服务的阿里云分析型数据库
- 为编辑框控件或是静态文本控件中的文本添加颜色
- python中移位操作 问题
- 逆向工程