谈谈23种设计模式在Android项目中的应用(4)
- UID
- 1029342
- 性别
- 男
|
谈谈23种设计模式在Android项目中的应用(4)
重构
暂无
策略模式
定义
有一系列的算法,将每个算法封装起来(每个算法可以封装到不同的类中),各个算法之间可以替换,策略模式让算法独立于使用它的客户而独立变化。
示例
public abstract class BaseAdvertManager {
protected abstract void doLoadAdvert();
}
public class FacebookAdvertManager extends BaseAdvertManager {
@Override
protected void doLoadAdvert() {
Log.v(TAG, "加载Facebook广告");
}
}
public class AdmobAdvertManager extends BaseAdvertManager {
@Override
protected void doLoadAdvert() {
Log.v(TAG, "加载Admob广告");
}
}
Android
Android在属性动画中使用时间插值器的时候就用到了策略模式。在使用动画时,你可以选择线性插值器LinearInterpolator、加速减速插值器AccelerateDecelerateInterpolator、减速插值器DecelerateInterpolator以及自定义的插值器。这些插值器都是实现根据时间流逝的百分比来计算出当前属性值改变的百分比。通过根据需要选择不同的插值器,实现不同的动画效果。
重构
暂无
状态模式
定义
状态模式中,行为是由状态来决定的,不同状态下有不同行为。状态模式和策略模式的结构几乎是一模一样的,主要是他们表达的目的和本质是不同。
示例
public interface TvState{
public void nextChannerl();
public void prevChannerl();
public void turnUp();
public void turnDown();
}
public class PowerOffState implements TvState{
public void nextChannel(){}
public void prevChannel(){}
public void turnUp(){}
public void turnDown(){}
}
public class PowerOnState implements TvState{
public void nextChannel(){
System.out.println("下一频道");
}
public void prevChannel(){
System.out.println("上一频道");
}
public void turnUp(){
System.out.println("调高音量");
}
public void turnDown(){
System.out.println("调低音量");
}
}
public interface PowerController{
public void powerOn();
public void powerOff();
}
public class TvController implements PowerController{
TvState mTvState;
public void setTvState(TvStete tvState){
mTvState=tvState;
}
public void powerOn(){
setTvState(new PowerOnState());
System.out.println("开机啦");
}
public void powerOff(){
setTvState(new PowerOffState());
System.out.println("关机啦");
}
public void nextChannel(){
mTvState.nextChannel();
}
public void prevChannel(){
mTvState.prevChannel();
}
public void turnUp(){
mTvState.turnUp();
}
public void turnDown(){
mTvState.turnDown();
}
}
public class Client{
public static void main(String[] args){
TvController tvController=new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
//调高音量,此时不会生效
tvController.turnUp();
}
}
Android
Android源码中很多地方都有用到状态模式,举一个例子,就是Android的WIFI管理模块。当WIFI开启时,自动扫描周围的接入点,然后以列表的形式展示;当wifi关闭时则清空。这里wifi管理模块就是根据不同的状态执行不同的行为。
与策略模式的区别
状态模式的行为是平行的、不可替换的,策略模式是属于对象的行为模式,其行为是彼此独立可相互替换的。
重构
项目中有需要功能如瘦脸等存在开关,现在是通过配置文件进行判断,可以通过状态模式进行重构,进而在具体处理图片时可以利用多态的特性直接使用对象进行处理
责任链模式
定义
使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系,将这些对象连成一条链,并沿这条链传递该请求,直到有对象处理它为止。
示例
/** * 抽象处理者 */
public abstract class Handler {
/** * 持有后继的责任对象 */
protected Handler successor;
/** * 示意处理请求的方法,虽然这个示意方法是没有传入参数的 * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 */
public abstract void handleRequest();
/** * 取值方法 */
public Handler getSuccessor() {
return successor;
}
/** * 赋值方法,设置后继的责任对象 */
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
/** * 具体处理者 */
public class ConcreteHandler extends Handler {
/** * 处理方法,调用此方法处理请求 */
@Override public void handleRequest() {
/** * 判断是否有后继的责任对象 * 如果有,就转发请求给后继的责任对象 * 如果没有,则处理请求 */
if(getSuccessor() != null)
{
System.out.println("放过请求");
getSuccessor().handleRequest();
}else
{
System.out.println("处理请求");
}
}
}
/** * 发起请求的客户类 */
public class Client {
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler();
handler1.setSuccessor(handler2);
//提交请求
handler1.handleRequest();
}
}
Android
在Android处理点击事件时,父View先接收到点击事件,如果父View不处理则交给子View,把责任依次往下传递;还有Java的异常捕获机制也是责任链模式的一种体现
重构
暂无
解释器模式
定义
给定一个语言,定义它的语法,并定义一个解释器,这个解释器用于解析语言。
示例
如编写各种功能模块的配置文件,然后按照项目定义的配置文件编写规则在运行过程中将配置文件加载为配置对象,这个模式在日常项目中应该或多或少都会使用到,就不贴出代码了。
Android
这个用到的地方也不少,其一就是Android的四大组件需要在AndroidManifest.xml中定义,其实AndroidManifest.xml就定义了,等标签(语句)的属性以及其子标签,规定了具体的使用(语法),通过PackageManagerService(解释器)进行解析。
重构
暂无
命令模式
定义
命令模式将每个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;将请求进行排队或者记录请求日志,以及支持可撤销操作。
举个例子来理解:当我们点击“关机”命令,系统会执行一系列操作,比如暂停事件处理、保存系统配置、结束程序进程、调用内核命令关闭计算机等等,这些命令封装从不同的对象,然后放入到队列中一个个去执行,还可以提供撤销操作。
示例
public void method() {
Handler.post(new Runnable() {
@Override
public void run() {
clearCache();
statics();
finish();
}
});
}
Android
在Android事件机制中,底层逻辑对事件的转发处理。每次的按键事件会被封装成NotifyKeyArgs对象,通过InputDispatcher封装具体的事件操作。还有一个例子就是我们使用的Runnable,我们可以使用它来封装自己想做的操作,然后交给Handler按顺序处理,或者在处理前remove取消掉
重构
现在的广告模块业务逻辑可以进行这种模式的重构,将广告拉取、广告展示等请求都封装成一个个的对象,放入到一个管理容器中按照一定规则进行调用,这样不仅可以避免在调用了展示广告接口的时候正在拉取广告,进而导致展示次数丢失的情况,也可以在出现网络错误等异常情况时可以对一些步骤进行取消。 |
|
|
|
|
|