您现在的位置: 弘智首页 > JAVA > JAVA框架学习 >

策略模式--从源码TabHost中看策略模式

时间:2012-10-31 09:33 来源:未知 作者:zcl

什么是策略模式:

 

      针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换

      应当由客户端自己决定在什么情况下使用什么具体策略模式。

      策略模式不适合于处理同时嵌套多于一个算法的情形。

 

优缺点:

 

优点:

1. 提供了管理相关的算法族的办法。

2. 提供了可以替换继承关系的办法。

3. 可以避免使用多重条件转移语句。

 

 缺点:

1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

2. 策略模式造成很多的策略类。

 

下面我们结合下源码中的TabHost的实现,来介绍下源码中如何使用策略模式

如果你在本地有下载源码的话,你可以在源码中找到这个类,在我的电脑中,它的位置如下:

F:\android-sdk\sources\android-15\android\widget\TabHost.java

 

这里引用林家男孩博客中的一张图:

这张图很好地说明了TabHost.java中的模式结构。

 

首先TabHost继承自FrameLayout,TabHost由两部分构成,一个是TabWidget,一个是TabSpace.

TabWidget用来指定和监听TabHost切换的,不是我们今天要讨论的范围。

TabSpec就是我们今天策略模式的主角了,下面对它进行分析。

 

TabHost可以看做是由一个个独立的用于点击来切换显示面板的Indicator和所对应的显示内容的面板Content组成。

也就是说一个Indicator对应一个Content,这在源码中对应着的是TabSpec这个类,换句话说:每个TabSpec对应着一个 Indicator和相应的显示内容的面板Content。这两个地方也是经常需要变动的。因为可能需要定制各种各样的TabHost,比如,使用自定义 的View来作为Indicator,当然显示内容的面板也需要是可以被定制的。

那么这时候我们就需要将变化的东西抽象出来。以便它可以被很方便地替换

 

举个例子来说:

我要定制一个TabSpec,需要满足两个基本条件:

1.一个Indicator

2.一个Content

这个时候我有可能仅仅想使用文字作为Indicator,那么我用LabelIndicatorStrategy来满足我的要求,假如这个时候,我 想换成图片加文字的方式来作为Indicator,怎么办呢?很简单,我可以换成LabelAndIconIndicatorStrategy类来满足要 求。显示面板Content也是一样道理。

当然,实现这些需要编程技巧和java的特性,针对接口编程,多态等。这个可以去查找相关资料。

更多内容 看:http://michaelye1988.iteye.com/blog/1709256

(责任编辑:admin)