`

“策略模式”详解

    博客分类:
  • java
阅读更多
下面讲解策略模式:

策略模式(Strategy Pattern)中体现了两个非常基本的面向面向对象涉及的原则:
--封装变化的概念
--编程中使用接口,而不是对接口的实现

策略模式的定义:
--定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
--策略模式使这些算法在客户端调用它们的时候能够互不影响地变化

策略模式的组成:
--抽象策略角色:策略类,通常由一个接口或者抽象类实现(例如Comporator接口)
--具体策略角色:包装了相关的算法和行为(例如Comporator接口的实现类)
--环境角色:持有策略类的引用,最终给客户端调用的(例如TreeSet或TreeMap,构造方法中接收了Comporator实现类的对象的一个引用)


策略模式的实现:
--策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口独立的类中,从而使得它们可以互相替换。
--策略模式使得算可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
--环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端。

策略模式的编写步骤:
1、对策略对象定义一个公共接口。
2、编写策略类,该类实现了上面的公共接口
3、在使用策略对象的类中保存一个对策略对象的引用。
4、在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。



策略模式的缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2、造成很多的策略类。
解决上述问题的方法是:采用工厂方法(这个现在还不讲)

以下是示例代码:

package com.shengshiyuan;

/**
 * 抽象策略角色
 * 类: Strategy <br>
 * 描述: TODO <br>
 * 作者: fangguanhong fangguanhong@163.com <br>
 * 时间: Oct 17, 2013 11:30:24 AM
 */
public interface Strategy {
	/**
	 * 完成两个整型数字的运算(加、减、乘、除)
	 * 方法: calculate <br>
	 * 描述: TODO <br>
	 * 作者: fangguanhong fangguanhong@163.com <br>
	 * 时间: Oct 17, 2013 11:30:35 AM
	 * @param a
	 * @param b
	 * @return
	 */
	public int calculate(int a, int b);
}


package com.shengshiyuan;

/**
 * 具体策略角色
 * 类: AddStrategy <br>
 * 描述: TODO <br>
 * 作者: fangguanhong fangguanhong@163.com <br>
 * 时间: Oct 17, 2013 11:32:11 AM
 */
public class AddStrategy implements Strategy {

	/**
	 * 完成假发操作
	 * 方法: calculate <br>
	 * 描述: TODO
	 * @param a
	 * @param b
	 * @return 
	 * @see com.shengshiyuan.Strategy#calculate(int, int)
	 */
	public int calculate(int a, int b) {
		return a + b;
	}

}


package com.shengshiyuan;

/**
 * 具体策略角色
 * 类: SubtractStrategy <br>
 * 描述: TODO <br>
 * 作者: fangguanhong fangguanhong@163.com <br>
 * 时间: Oct 17, 2013 11:33:30 AM
 */
public class SubtractStrategy implements Strategy {

	/**
	 * 完成减法操作
	 * 方法: calculate <br>
	 * 描述: TODO
	 * @param a
	 * @param b
	 * @return 
	 * @see com.shengshiyuan.Strategy#calculate(int, int)
	 */
	public int calculate(int a, int b) {
		return a - b;
	}

}


package com.shengshiyuan;

/**
 * 具体策略类
 * 类: MultiplyStrategy <br>
 * 描述: TODO <br>
 * 作者: fangguanhong fangguanhong@163.com <br>
 * 时间: Oct 17, 2013 11:34:55 AM
 */
public class MultiplyStrategy implements Strategy {

	/**
	 * 完成乘法操作
	 * 方法: calculate <br>
	 * 描述: TODO
	 * @param a
	 * @param b
	 * @return 
	 * @see com.shengshiyuan.Strategy#calculate(int, int)
	 */
	public int calculate(int a, int b) {
		return a * b;
	}

}


package com.shengshiyuan;

/**
 * 具体策略角色
 * 类: DivideStrategy <br>
 * 描述: TODO <br>
 * 作者: fangguanhong fangguanhong@163.com <br>
 * 时间: Oct 17, 2013 11:35:41 AM
 */
public class DivideStrategy implements Strategy {

	/**
	 * 完成除法操作
	 * 方法: calculate <br>
	 * 描述: TODO
	 * @param a
	 * @param b
	 * @return 
	 * @see com.shengshiyuan.Strategy#calculate(int, int)
	 */
	public int calculate(int a, int b) {
		return a / b;
	}

}


package com.shengshiyuan;

/**
 * 环境角色
 * 类: Environment <br>
 * 描述: TODO <br>
 * 作者: fangguanhong fangguanhong@163.com <br>
 * 时间: Oct 17, 2013 11:37:24 AM
 */
public class Environment {
	private Strategy strategy;

	/**
	 * 在构造方法中初始化策略类的引用
	 * 标题: 构造器 <br>
	 * 描述: TODO <br>
	 * 作者: fangguanhong fangguanhong@163.com <br>
	 * 时间: Oct 17, 2013 11:49:35 AM
	 * @param strategy
	 */
	public Environment(Strategy strategy) {
		this.strategy = strategy;
	}

	public int calculate(int a, int b) {
		return strategy.calculate(a, b);
	}

	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}

	public Strategy getStrategy() {
		return this.strategy;
	}
}


package com.shengshiyuan;

public class Client {
	public static void main(String[] args) {
		AddStrategy addStrategy = new AddStrategy();

		// 加
		Environment environment = new Environment(addStrategy);
		System.out.println(environment.calculate(3, 4));

		// 减
		SubtractStrategy subtractStrategy = new SubtractStrategy();
		environment.setStrategy(subtractStrategy);
		System.out.println(environment.calculate(3, 4));

		// 乘
		MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
		environment.setStrategy(multiplyStrategy);
		System.out.println(environment.calculate(3, 4));

		// 除
		DivideStrategy divideStrategy = new DivideStrategy();
		environment.setStrategy(divideStrategy);
		System.out.println(environment.calculate(3, 4));
	}
}




最后留的一个用策略模式实现的作业(此作业进行了详细讲解,同时自己也做出来了,经常回忆性的看看):
1.  有这样一个类:
public class Person {
   private int id;
   private String name;
   private int age;
}
// getter and setter
要求:假如有若干个类Person对象存在一个List当中,对他们进行排序,分别按照名字、
年龄、id 进行排序(要有正序与倒序两种排序方式)。假如年龄或者姓名重复,按照id
的正序进行排序。要求使用策略模式进行。

作业答案见附件
分享到:
评论

相关推荐

    设计模式之策略模式详解的个人学习资料,欢迎使用

    策略模式设计模式之策略模式详解。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    JAVA策略模式详解.doc

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一个策略接口,该接口定义了一组相关操作,然后创建一系列实现了该接口的具体策略类。这些策略类分别代表不同的算法或...

    Android编程设计模式之策略模式详解

    Android编程设计模式之策略模式详解 Android编程设计模式中,策略模式是一种常用的设计模式,它解决了系统中多种算法或策略的选择问题。在Android开发中,策略模式可以应用于多种场景,例如排序算法、支付方式选择...

    详解SpringBoot结合策略模式实战套路

    SpringBoot结合策略模式实战套路 策略模式是一种常用的设计模式,它可以使我们的代码更加灵活、可维护和可扩展。在SpringBoot项目中,策略模式可以与依赖注入机制相结合,实现更加灵活的业务逻辑处理。在本文中,...

    深入理解JavaScript系列(33):设计模式之策略模式详解

    主要介绍了深入理解JavaScript系列(33):设计模式之策略模式详解,策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户,需要的朋友可以参考下

    java常用设计模式-策略模式

    Java 策略模式详解 策略模式是一种行为型设计模式,它允许您定义一系列算法,将每个算法封装起来,并使它们可以互换使用。这种模式使得算法可以独立于使用它们的客户端而变化。在 Java 中,策略模式通常由一个接口...

    C#設計模式之策略模式

    ### C#设计模式之策略模式详解 在软件工程与编程领域,设计模式被视为解决常见问题的模板或指导原则,能够帮助开发者以一种可复用的方式解决问题。其中,“策略模式”是一种行为型设计模式,它允许在运行时选择算法...

    SpringBoot+策略模式 实现多种文件存储方式

    ### 策略模式详解 策略模式是一种行为设计模式,它使你能在运行时选择算法或策略。在文件存储场景下,我们可以定义一个抽象的`FileStorageStrategy`接口,里面包含`store`、`retrieve`等方法。然后,我们创建两个...

    Java设计模式之策略模式详解

    Java设计模式中的策略模式是一种行为设计模式,它允许在运行时选择算法或策略,从而提供了更大的灵活性。策略模式的核心在于将算法封装到独立的可互换的策略类中,使得算法的变化不会影响到使用算法的客户端代码。 ...

    《JAVA与模式》之策略模式

    javase 设计模式的strategy pattern《JAVA与模式》之策略模式详解

    Android设计模式之策略模式详解

    策略模式 一个功能的效果,有不同的算法与策略,根据不同的选择选择不同的结果。 简单来说,只要你写过程序就用过策略模式,不要说没用过,难道if-else(switch)没用过吗….. if-else在其实就是一个策略模式的体现,根据...

    JavaScript设计模式之策略模式详解

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在JavaScript中,策略模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。以下是对策略模式的详细解析: 首先,策略模式的核心...

    Java策略模式+案例

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式允许我们定义一组算法或策略,并将每个策略封装为一个类,使得它们可以互换,而不会影响到客户端代码。这种模式的核心在于"策略",...

Global site tag (gtag.js) - Google Analytics