`
Iam42
  • 浏览: 275809 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中的设计模式--策略模式

阅读更多

“策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于算法的客户”

场景:
一个基类有很多个子类,现在他们需要实现一个共同的函数,凡是各个子类的实现可能各有不同,这时候应该怎么办?

思路1:把这个函数写在基类里,然后子类去根据自己的需要重写这个函数
好处:代码可以复用,对应了设计原则“找出应用中可能变化之处,把它独立出来,不要和那些不变的代码混在一起”
坏处:可能会有子类不小心忘了写了,就直接继承了基类的实现,这样的错误比较难查

思路2:直接把这个方法做成接口放到基类里,然后子类去实现
好处:代码的灵活性很好,各个子类修改自己的方法不会影响别人,对应了设计原则“多用组合 少用继承”
坏处:代码无法复用

所以,这两者扬长避短,形成了一个这样的解决思路:
1. 先一个新的接口,用来解决问题,然后做出它的实现一系列。
2. 在父类里实例化一个这个接口。然后在那个函数里调用这个接口的方法解决问题
3.子类为这个接口选择实现

这就等于把这个函数的实现委托给了另一个类,两个类组合起来解决问题,“多用组合 少用继承”

 

标准实现

基类:

 

public abstract class Base {

     protect Behavior beh;

     public Base() {
     }

     protect void setBehavior(Behavior beh) {
          this.beh = ben;
     }

     public void performBehavior() {
          if (beh != null) {
               beh.doIt();
          }
     }
}

 

子类

 

public class Child extends Base {
     
     public Child() {
          Behavior beh = new Behavior1();
          setBehavior(h);
     }
}

 

委托接口:

 

public interface Behavior {
     public void doIt();
}

 

委托接口实现1

 

public class Behavior1 implements Behavior {
     public void doIt() {
          //具体实现
     }
}

 

 

android应用实例
google Volley
Volley中的每个网络请求被封装成了一个类,他们共同继承自基类Request,Request的子类有JsonObjectRequest, ImageRequest等。他们都需要一个网络重连的算法。
所以google写了一个这个算法的接口

/**
 * Retry policy for a request.
 */
public interface RetryPolicy {

    /**
     * Returns the current timeout (used for logging).
     */
    public int getCurrentTimeout();

    /**
     * Returns the current retry count (used for logging).
     */
    public int getCurrentRetryCount();

    /**
     * Prepares for the next retry by applying a backoff to the timeout.
     * @param error The error code of the last attempt.
     * @throws VolleyError In the event that the retry could not be performed (for example if we
     * ran out of attempts), the passed in error is thrown.
     */
    public void retry(VolleyError error) throws VolleyError;
}

 它的实现有DefaultRetryPolicy等


这里是个十分标准的策略模式
在Request基类中有一个成员变量
  

  private RetryPolicy mRetryPolicy;

 
同时也有一个set方法

 

    /**
     * Sets the retry policy for this request.
     *
     * @return This Request object to allow for chaining.
     */
    public Request<?> setRetryPolicy(RetryPolicy retryPolicy) {
        mRetryPolicy = retryPolicy;
        return this;
    }

  然后在初始化Request的时候调用了这个set方法,把适当的重联算法装配进去

    public Request(int method, String url, Response.ErrorListener listener) {
        mMethod = method;
        mUrl = url;
        mErrorListener = listener;
        setRetryPolicy(new DefaultRetryPolicy());  //这个是基类,因此放了一个默认的方法进去

        mDefaultTrafficStatsTag = TextUtils.isEmpty(url) ? 0: Uri.parse(url).getHost().hashCode();
    }
           

    public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
            Config decodeConfig, Response.ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        setRetryPolicy(
                new DefaultRetryPolicy(IMAGE_TIMEOUT_MS, IMAGE_MAX_RETRIES, IMAGE_BACKOFF_MULT)); //这个是子类,为其选择了特殊的重联算法
        mListener = listener;
        mDecodeConfig = decodeConfig;
        mMaxWidth = maxWidth;
        mMaxHeight = maxHeight;
    }

 

分享到:
评论

相关推荐

    android应用开发设计模式之-策略模式

    在Android应用开发中,设计模式是一种重要的编程范式,它为解决特定问题提供了标准的解决方案。今天我们将深入探讨其中的一种——策略模式。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java...

    Java 设计模式-策略模式(Strategy)Android讲解

    总结来说,策略模式在Java和Android开发中是一种非常实用的设计模式,它通过封装不同的策略,使程序能够根据需要在运行时灵活选择和切换算法,提高了代码的灵活性和可扩展性。理解和掌握策略模式对于提升Android开发...

    Android设计模式之--迭代器模式

    在Android设计模式中,迭代器模式的主要作用是分离了聚合对象(如数组、列表)与遍历它的方法。这样,我们可以在不改变聚合对象结构的情况下添加新的遍历方式,提高了代码的灵活性和可扩展性。迭代器模式通常包含...

    Android-23种设计模式

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...

    android常用设计模式

    Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...

    基于Android设计模式之--SDK源码之策略模式的详解

    策略模式在Android开发中是一种非常重要的设计模式,它允许程序在运行时动态选择执行的算法或策略,从而提高代码的灵活性和可扩展性。在Android SDK源码中,策略模式被广泛应用于各种场景,比如动画的实现就是一个...

    设计模式之策略模式Android计算器实例

    在这个"设计模式之策略模式Android计算器实例"中,我们将探讨如何在Android应用中使用策略模式来实现一个计算器的功能。 首先,策略模式的核心思想是定义一系列算法,并将每个算法封装起来,使它们可以互相替换。...

    Android源码设计模式

    在Android系统中,设计模式是开发者理解和驾驭代码的关键。这些模式源自《设计模式:可复用面向对象软件的基础》一书,由“Gang of Four”(GoF)提出,被广泛应用于各种软件开发中,尤其是在Android框架内。本文将...

    Java和Android源码设计模式 2017-03-21

    在Android开发中,设计模式的应用同样广泛。以下是一些常见模式在Android中的应用示例: - **单例模式**:如`Context`的实现,确保每个应用程序只有一个实例。 - **简单工厂模式**:`LayoutInflater`就是一个例子,...

    Android源码设计模式解析与实战 pdf 完整版

    总的来说,《Android源码设计模式解析与实战》是一本深入浅出的Android设计模式教程,对于希望提升Android开发技能的工程师来说,是一份不可多得的学习资料。通过对书中的知识点进行深入学习和实践,开发者将能更好...

    《Android源码设计模式解析与实战》PDF版本下载.txt

    《Android源码设计模式解析与实战》这本书详细介绍了设计模式在Android开发中的应用,并通过丰富的案例帮助读者深入理解这些模式的实际应用场景。无论是初学者还是有一定经验的开发者,都能从中获得宝贵的实践经验和...

    设计模式在android中的应用之2,策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Android开发中,策略模式的应用可以帮助我们更好地实现灵活性和可扩展性,使得代码结构更清晰,易于维护。下面我们将详细探讨策略模式的原理、如何...

    Android源码设计模式解析与实战

    《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍,适合已经有一定Android开发基础并希望进一步提升技术能力的开发者阅读。这本书旨在通过实例解析,帮助读者理解并掌握...

    Java和Android源码设计模式

    此外,在Android系统源码中也可以看到多种设计模式的应用,如单例模式在ContextImpl类中的使用,以及观察者模式在BroadcastReceiver中的体现等。 通过学习和实践这些设计模式,不仅可以提高代码质量,还能显著提升...

    Android源码设计模式解析与实战.rar

    在Android开发领域,深入理解源码中的设计模式是提升技能水平的关键步骤。"Android源码设计模式解析与实战"这份资料旨在帮助开发者更好地理解和运用这些模式。设计模式是软件工程中经过验证的解决常见问题的最佳实践...

    Android设计模式

    下面将详细探讨Android设计模式中的关键知识点。 1. 单例模式(Singleton):在Android中,单例模式用于确保一个类只有一个实例,并提供全局访问点。例如,Android系统的应用上下文(Context)就是通过单例模式管理的...

    策略模式在android中使用

    策略模式是一种设计模式,主要应用于对象行为的设计,其核心思想是将不同的算法策略封装到独立的类中,这些类都实现一个公共的接口。在Android开发中,策略模式的应用可以帮助我们更好地管理代码,提高代码的可扩展...

    Android 源码设计模式解析与实战(完整版)

    《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍。这本书旨在帮助开发者理解Android系统内部的工作机制,并通过实际案例来应用和掌握设计模式,提升开发技能和代码质量。 ...

    Android-用Kotlin实现设计模式代码

    以上这些设计模式都是软件开发中的重要工具,理解并合理运用它们,能够提升Android应用的质量和可维护性。通过学习和实践《Design-Patterns-In-Kotlin》项目,开发者可以深入掌握如何在Kotlin环境下应用这些设计模式...

Global site tag (gtag.js) - Google Analytics