android timer 控件,TimerView 一个解耦良好的计时控件,可自由扩展。 @codeKK Android开源站...

世上本没有解耦,需求改的多了也便有了解耦。 —— 产品经理

本例将通过一个计时控件,聊聊如何解耦~

本TimerView仅作为demo,不保证其健壮性,请勿在实际项目中使用。

特点

UI 容器与计时逻辑分离

UI 容器与具体 UI 布局分离

Let's Go

话说,小明在做一个电商项目,有个倒计时需求。

需求 1.0

要求"时、分、秒"数字显示。

这个简单,小明很快自定义了一个TimerView:

public class TimerView {

TextView tvHour, tvMinute, tvSecond;

TextView divider1, divider2;

...

}

85d32e5b7ff181865e6065ed924131a6.gif

需求 2.0

界面太丑啦,加点颜色和背景吧~

这个也简单,小明很快加了一些自定义属性:

public class TimerView {

TextView tvHour, tvMinute, tvSecond;

TextView divider1, divider2;

// 添加 自定义属性

int tvHourBgRes, tvMinuteBgRes, tvSecondBgRes;

int tvHourColor, tvMinuteColor, tvSecondColor;

...

}

bb89d64cbe5a263e48ef665d47c26ba0.gif

需求 3.0

这时,产品经理又跑了过来,你看我发现了啥~

发现一套火焰数字.jpg,好炫酷的说,帮忙改上去吧~

e812cc20b9e5429774f8deaa414b8242.gif

小明内心:你 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~

2ceb247b34a7cfc43b29b723dc867b45.gif

需求 5.0

产品经理:小明,你还活着那?我发现机械表更好看诶~

小明: **, 我改就是了

885b15ebc1c0dfe99fde569be46acd84.gif

感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值