“策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于算法的客户”
场景:
一个基类有很多个子类,现在他们需要实现一个共同的函数,凡是各个子类的实现可能各有不同,这时候应该怎么办?
思路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应用开发中,设计模式是一种重要的编程范式,它为解决特定问题提供了标准的解决方案。今天我们将深入探讨其中的一种——策略模式。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java...
总结来说,策略模式在Java和Android开发中是一种非常实用的设计模式,它通过封装不同的策略,使程序能够根据需要在运行时灵活选择和切换算法,提高了代码的灵活性和可扩展性。理解和掌握策略模式对于提升Android开发...
在Android设计模式中,迭代器模式的主要作用是分离了聚合对象(如数组、列表)与遍历它的方法。这样,我们可以在不改变聚合对象结构的情况下添加新的遍历方式,提高了代码的灵活性和可扩展性。迭代器模式通常包含...
在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...
Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...
策略模式在Android开发中是一种非常重要的设计模式,它允许程序在运行时动态选择执行的算法或策略,从而提高代码的灵活性和可扩展性。在Android SDK源码中,策略模式被广泛应用于各种场景,比如动画的实现就是一个...
在这个"设计模式之策略模式Android计算器实例"中,我们将探讨如何在Android应用中使用策略模式来实现一个计算器的功能。 首先,策略模式的核心思想是定义一系列算法,并将每个算法封装起来,使它们可以互相替换。...
在Android系统中,设计模式是开发者理解和驾驭代码的关键。这些模式源自《设计模式:可复用面向对象软件的基础》一书,由“Gang of Four”(GoF)提出,被广泛应用于各种软件开发中,尤其是在Android框架内。本文将...
在Android开发中,设计模式的应用同样广泛。以下是一些常见模式在Android中的应用示例: - **单例模式**:如`Context`的实现,确保每个应用程序只有一个实例。 - **简单工厂模式**:`LayoutInflater`就是一个例子,...
总的来说,《Android源码设计模式解析与实战》是一本深入浅出的Android设计模式教程,对于希望提升Android开发技能的工程师来说,是一份不可多得的学习资料。通过对书中的知识点进行深入学习和实践,开发者将能更好...
《Android源码设计模式解析与实战》这本书详细介绍了设计模式在Android开发中的应用,并通过丰富的案例帮助读者深入理解这些模式的实际应用场景。无论是初学者还是有一定经验的开发者,都能从中获得宝贵的实践经验和...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Android开发中,策略模式的应用可以帮助我们更好地实现灵活性和可扩展性,使得代码结构更清晰,易于维护。下面我们将详细探讨策略模式的原理、如何...
《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍,适合已经有一定Android开发基础并希望进一步提升技术能力的开发者阅读。这本书旨在通过实例解析,帮助读者理解并掌握...
此外,在Android系统源码中也可以看到多种设计模式的应用,如单例模式在ContextImpl类中的使用,以及观察者模式在BroadcastReceiver中的体现等。 通过学习和实践这些设计模式,不仅可以提高代码质量,还能显著提升...
在Android开发领域,深入理解源码中的设计模式是提升技能水平的关键步骤。"Android源码设计模式解析与实战"这份资料旨在帮助开发者更好地理解和运用这些模式。设计模式是软件工程中经过验证的解决常见问题的最佳实践...
下面将详细探讨Android设计模式中的关键知识点。 1. 单例模式(Singleton):在Android中,单例模式用于确保一个类只有一个实例,并提供全局访问点。例如,Android系统的应用上下文(Context)就是通过单例模式管理的...
策略模式是一种设计模式,主要应用于对象行为的设计,其核心思想是将不同的算法策略封装到独立的类中,这些类都实现一个公共的接口。在Android开发中,策略模式的应用可以帮助我们更好地管理代码,提高代码的可扩展...
《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍。这本书旨在帮助开发者理解Android系统内部的工作机制,并通过实际案例来应用和掌握设计模式,提升开发技能和代码质量。 ...
以上这些设计模式都是软件开发中的重要工具,理解并合理运用它们,能够提升Android应用的质量和可维护性。通过学习和实践《Design-Patterns-In-Kotlin》项目,开发者可以深入掌握如何在Kotlin环境下应用这些设计模式...