写代码的时候经常遇到下面的情况,之前处理过一次,使用了策略模式,当时不是很理解,于是自己写了个简单的例子,清晰了逐渐。
首先看下面的代码,
public class Proxy {
private static String LOC_TOP = "top";
private static String LOC_LEFT = "lrft";
private static String LOC_RIGHT = "fight";
private static String LOC_BOT = "bot";
private static String LOC_CENTER = "center";
public static String getLocation(String loc){
if(LOC_TOP.equals(loc)){
return LOC_TOP;
}else if(LOC_LEFT.equals(loc)){
return LOC_LEFT;
}else if(LOC_RIGHT.equals(loc)){
return LOC_RIGHT;
}else if(LOC_BOT.equals(loc)){
return LOC_BOT;
}else{
return LOC_CENTER;
}
}
public static void main(String[] args) {
System.out.println(getLocation(LOC_BOT));
}
}
上述代码如果需要添加一个位置信息,需要做
(1)增加一个常量
(2)加一个else if
(3)增加一个常量对应的实现
如何改进?
使用策略模式,只需要增加一个此策略对应的实现即可,原有的逻辑不需要变更,扩展方便
何为策略模式?
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
何时使用策略模式?
1) 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。
2) 如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则。客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。
3) 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复发的和只与算法有关的数据。
Strategy:
策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。
ConcreteStrategy:
具体的策略实现,也就是具体的算法实现。
Context:
上下文,负责和具体的策略类交互,通常上下文会持有一个真正的策略实现,上下文还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。
改进后的代码:
/**
*相当于上图中的context,方法的参数里面是一个接口
*调用者可以根据策略的不同,传入不同的实现类,从而实现扩展,
*同时,原始代码里面的逻辑不用变化
*/
public class ProxyStra {
public static String getLocation(Strategy strategy){
return strategy.getResult();
}
//相当于客户端的调用
public static void main(String[] args) {
System.out.println(ProxyStra.getLocation(new TopStrategy()));
}
}
//策略的抽象,接口
public interface Strategy {
public String getResult();
}
//一种策略的实现
public class TopStrategy implements Strategy {
@Override
public String getResult() {
return "top";
}
}
优缺点:
-----------------------------------------------
定义一系列算法;
避免多重条件语句;
更好的扩展性;
-----------------------------------------------
客户必须了解每种策略的不同;
增加了对象数目;
只适合扁平的算法结构;
参考:
分享到:
相关推荐
【大学外语学习策略模式探讨】 大学外语学习策略模式的研究旨在改善教学方法,强化学生的自主学习能力,特别是对于大学英语教学,教师不仅要传授语言知识,还要培养学生掌握有效的学习策略。研究表明,成功的语言...
【篇 2】基于贸易绿色壁垒盛行下的企业国际营销策略模式探讨 在全球化的背景下,贸易绿色壁垒的盛行对企业国际营销策略提出了新的挑战。绿色壁垒是指各国为了保护环境而设立的贸易限制措施,如环保标准、生态标签...
大型企业导入企业资源规划系统之策略模式探讨.pptx
本文将探讨三个重要的设计模式:抽象工厂模式、工厂方法模式以及策略模式,并结合一个实际的场景——手机加工厂,来具体阐述它们的应用。 首先,我们来看**抽象工厂模式**。这个模式主要用于创建相关或依赖对象的...
这篇文章将深入探讨如何在Spring中运用策略模式,并结合源码分析其工作原理。 策略模式的核心在于将算法封装到具有共同接口的独立类中,使得它们可以相互替换。在Spring框架中,策略模式常用于处理不同策略的配置和...
今天我们将探讨两种重要的设计模式:简单工厂模式和策略模式。这两种模式都是面向对象设计的核心概念,它们各自有着独特的优势和适用场景。 首先,我们来理解简单工厂模式。简单工厂模式是创建型设计模式的一种,它...
在软件设计模式的世界里,"工厂模式"和"策略模式"是两种常用的设计模式,它们在构建可扩展和可维护的代码中起着至关重要的作用。让我们深入探讨这两种模式及其在实际开发中的应用。 首先,工厂模式是一种创建型设计...
下面我们将详细探讨策略模式的核心概念、实现方式以及在实际开发中的应用。 ### 一、策略模式的概念 策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略对象改变了一个类的行为,策略类...
策略模式和单例模式是软件设计中两种非常重要的设计模式,它们在实际开发中有着广泛的应用。在这篇文章中,我们将深入探讨这两种模式的核心概念、实现方式以及如何在实际项目中运用。 策略模式是一种行为设计模式,...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过接口或抽象类来定义一系列的算法,并将每个算法封装起来,使得它们可以互相替换,让算法独立于使用它的客户。下面我们将...
本篇文章将深入探讨两种重要的设计模式:策略模式和模板模式。通过理解这两种模式,开发者可以更好地组织代码,提高代码的灵活性和可扩展性。 ### 策略模式 策略模式是一种行为设计模式,它使你能在运行时改变对象...
在“记事本 使用了策略模式和命令模式”这个主题中,我们将深入探讨这两种设计模式以及它们如何应用于记事本软件的实现。 首先,让我们了解策略模式。策略模式是一种行为设计模式,它允许在运行时选择算法或策略。...
在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...
本案例主要探讨了三种经典的设计模式:抽象工厂模式、工厂方法模式和策略模式,并以手机加工厂为实际应用场景进行阐述。 首先,**抽象工厂模式**是创建型设计模式之一,它提供一个接口,用于创建相关或依赖对象的...
虽然无法直接访问该链接,但我们可以根据通用的策略模式概念进行深入探讨。策略模式的核心思想是定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。这些算法都遵循一个公共接口,因此客户端代码可以依赖...
下面我们将详细探讨策略模式的原理、如何在Android中应用以及其优势。 ### 一、策略模式的定义与原理 策略模式定义了一系列的算法,并将每个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户...
今天我们将深入探讨两种常用的设计模式:单例模式和策略模式。这两种模式在实际开发中有着广泛的应用,它们分别解决了不同的问题,提高了代码的可维护性和可扩展性。 首先,我们来看单例模式。单例模式是一种保证一...
在这个“java设计模式-策略模式”的示例中,我们将深入探讨如何使用策略模式来实现一个简单的超市促销系统。 策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。这使得算法的...
本文将深入探讨策略模式在iOS中的应用,以及如何实现这一模式。 策略模式的核心概念是定义一系列算法,并将每个算法封装起来,使它们可以相互替换。这样,算法的变化就不会影响到使用算法的客户。在iOS开发中,这...
在本篇中,我们将深入探讨“策略模式”,这是一种行为设计模式,它使算法族能够互换,使得代码能根据环境或策略的不同选择不同的行为。 策略模式的核心思想是将算法封装在独立的类中,使得它们可以互相替换。这种...