`
不平凡的人
  • 浏览: 35441 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

策略设计模式

 
阅读更多

本文从以下方面介绍策略模式

一、策略模式概念

二、策略模式的示例

三、策略模式的优缺点

四、总结

 

一、策略模式概念

 

     策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,交给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

 


 

 此模式涉及到三个场景:

  ●  环境(Context)(用于客户端具体实现):持有一个Strategy的引用。

  ●  抽象策略(Strategy)(行为族):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)(实现行为族的子类):包装了相关的算法或行为。

 

二、策略模式的具体示例

 

上面的文字摘自其他博客有些难以理解,运用一个实例加深对策略模式的理解

 

1、算法簇

     (1)对于每一个策略算法来说,它们具有共同的行为,因此将这些共同的行为抽象为一个接口,然后子类实现这些接口形成一个算法族

package net.oschina.design.strategy.interfac;

/**
 * 策略模式,示例 排序算法接口
 * 
 * @author Freedom
 * 
 */
public interface Sort {

	void sort(int[] array);
}


    (2)子类实现具体的行为

 

package net.oschina.design.strategy.interfac.impl;

import java.util.Arrays;

import net.oschina.design.strategy.interfac.Sort;

/**
 * 冒泡算法
 * 
 * @author Freedom
 * 
 */
public class BubbleSort implements Sort {

	@Override
	public void sort(int[] array) {

		int temp = 0;
		for (int i = 0; i < array.length - 1; i++) {
			for (int j = 0; j < array.length - 1 - i; j++) {
				if (array[j] > array[j + 1]) {
					temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(array) + " bubbleSort");

	}

}

 

package net.oschina.design.strategy.interfac.impl;

import java.util.Arrays;

import net.oschina.design.strategy.interfac.Sort;

/**
 * 插入排序
 * 
 * @author Freedom
 * 
 */
public class InsertSort implements Sort {

	@Override
	public void sort(int[] array) {
		for (int i = 1; i < array.length; i++) {
			int temp = array[i];
			int j = i - 1;
			for (; j >= 0 && array[j] > temp; j--) {
				// 将大于temp的值整体后移一个单位
				array[j + 1] = array[j];
			}
			array[j + 1] = temp;
		}
		System.out.println(Arrays.toString(array) + " insertSort");
	}

}

 

2、父类中组合行为族的接口对象

      ①父类中组合一个算法族接口对象,目的是为了供客户端(子类)实例化的同时也实例化出某一个具体的算法族的子类对象

       ②简言之,下述抽象类的目的也是供客户端子类去具体实现,客户端实例化的同时确定具体的算法族对象

package net.oschina.design.strategy.abs;

import net.oschina.design.strategy.interfac.Sort;

/**
 * 策略模式,抽象父类
 * 
 * @author Freedom
 * 
 */
public abstract class SortAbstract {

	// 排序的属性,组合了行为族的接口对象
	protected Sort sort;

	public SortAbstract() {
	}

	// 调用排序方法
	public void display(int[] array) {
		sort.sort(array);
	}
}

 

3、客户端子类

package net.oschina.design.strategy.abs.userimpl;

import net.oschina.design.strategy.abs.SortAbstract;
import net.oschina.design.strategy.interfac.impl.BubbleSort;

/**
 * 使用冒泡排序的用户
 * 
 * @author Freedom
 * 
 */
public class BubbleUser extends SortAbstract {

	public BubbleUser() {

		sort = new BubbleSort();
	}
}

 

三、策略模式的优缺点

 

1、优点

       (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)策略模式将调用的算法单独封装为行为,这样与具体调用的使用者进行了分离,便于后期的维护与扩展。

 

2、缺点

      (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略算法很多,那么对象的数目也会很多,在父类中进行组合的对象也会很多

 

四、总结

 

1、策略模式的具体实现

      分别封装行为的接口,实现行为族。父类里面组合行为族的接口对象,在子类具体实例化行为对象。

 

2、策略模式的原则

      分离变化的的部分(此变化指的是具有相同行为,但是具体实现不同如:上例中的排序算法),封装为接口,基于接口编写各种功能,此模式实现行为算法与使用者独立。

 

3、算法族之间的平等性

        策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法(多个策略算法)在实现上也是相互独立的,相互之间是没有依赖的。

  所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

 

  • 大小: 15.1 KB
分享到:
评论

相关推荐

    策略设计模式简单代码实现

    策略设计模式是软件工程中的一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的...

    策略设计模式_构建公共通用的Dao

    标题中的“策略设计模式_构建公共通用的Dao”指出,我们即将探讨的是如何利用策略设计模式来构建一个可复用的、通用的数据访问对象(DAO)层。在软件开发中,DAO层通常负责与数据库进行交互,执行增删改查等操作。...

    Head first C++策略设计模式

    在这个特定的压缩包中,我们关注的是“策略设计模式”的实现。策略设计模式是一种行为设计模式,它允许在运行时动态地改变对象的行为。 策略模式的核心思想是将算法族封装到各自独立的类中,使得它们可以互换使用。...

    loki 库 源码 策略设计模式

    《洛基库(Loki)源码解析:策略设计模式的深度探究》 洛基库(Loki)是一个由C++编程语言实现的开源库,它以其强大的模板设计能力而闻名,尤其在策略设计模式的应用上表现突出。该库不仅为开发者提供了多种实用的...

    使用策略设计模式在OpenCV中实现颜色识别的功能(包含详细的完整的程序和数据)

    内容概要:这篇文章介绍了一种利用策略设计模式与OpenCV在Python环境里构建颜色检测系统的实现方法。主要介绍了创建支持自定义颜色目标及容差的检测系统的具体过程和代码细节,并指出了该系统可进一步改进的方向。 ...

    基于C#.NET异步图形验证码识别组件(集成了若快、优优云、打码兔、云打码等平台,准确率95%,速度2-6秒)采用策略设计模式

    【作品名称】:基于C#.NET异步图形验证码识别组件(集成了若快、优优云、打码兔、云打码等平台,准确率95%,速度2-6秒)采用策略设计模式 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设...

    springmvc +mybatis采用策略设计模式基于拦截器实现按年分表

    本项目将这两种技术结合,并利用策略设计模式和拦截器来实现一个按年份划分的数据库分表策略。下面将详细阐述这个项目中的核心知识点。 1. **SpringMVC**: SpringMVC是Spring框架的一部分,它是一个模型-视图-...

    Java 设计模式 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...

    设计模式之策略模式 鸭子问题

    设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。...

    php设计模式案例详解

    21. **策略设计模式**:定义一系列的算法,并将每一个算法封装起来,使得它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。 以上就是PHP设计模式的一些核心概念和应用场景,每个模式都有其独特的优点...

    设计模式之策略模式

    设计模式中的策略模式。根据《设计模式》一书编写

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式-策略者

    "策略者"(Strategy)设计模式是其中的一种行为模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用算法的客户。 在《设计模式-策略者》这篇文章中,作者深入浅...

    GuitarHero:策略设计模式演示

    《策略设计模式在Java编程中的应用——以"吉他英雄"为例》 策略设计模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java编程中,这种模式的应用广泛且强大,尤其在处理需要动态变化算法或者行为的场景...

    设计模式--策略模式java例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常用于替换硬编码的条件语句,使代码更加灵活、可扩展和易于维护。下面我们将详细探讨策略模式的核心概念、实现方式以及在实际...

    Learning+PHP设计模式

    通过学习如何在代码中使用设计模式,可以更高效地构建服务器端应用,在这个过程中,你的PHP编程水平也将逐步提高。...第12章 策略设计模式的灵活性 第13章 职责链设计模式 第14章 利用观察者模式构建多设备CMS

Global site tag (gtag.js) - Google Analytics