java策略设计模式


一、策略模式的定义
1、定义了一组算法,将每个算法包装起来,并且使它们之间可以互换
2、策略模式使得在调用这些算法的时候能够不相互影响,改变不同算法的实现方式不影响其他算法的使用,即策略模式让算法独立于使用它们的客户端而独立变化。


二、策略模式体现了两个非常基本的面向对象设计的原则:
1、封装变化的概念。
2、编程中使用接口,而不是使用对接口的实现 


三、策略模式的角色组成
抽象策略角色:策略类,通常是一个接口或者抽象类
        具体策略角色:包装了相关的算法和行为,实现了策略类
环境角色:持有一个策略类的引用,最终给客户端调用的


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

5、客户端进行调用策略对象的引用

/*
	不同算法对象的使用
*/
import java.util.Arrays;

public class Test{

	public static void main(String[] args) {
		
		ScoreManager manager = new ScoreManager();
		manager.setArithmetic(new ErFenLookup());
		manager.max();
	}
}

interface LookupArithmetic{

	float loopup(float[] scores);
}

class ShunXuLookup implements LookupArithmetic{

	public float loopup(float[] scores){

		System.out.println("顺序查找算法");
		return 0;
	}
}

class ErFenLookup implements LookupArithmetic{

	public float loopup(float[] scores){

		System.out.println("二分查找算法");
		return 0;
	}
}

class FenKuaiLookup implements LookupArithmetic{

	public float loopup(float[] scores){

		System.out.println("分块查找算法");
		return 0;
	}
}

class HashLookup implements LookupArithmetic{

	public float loopup(float[] scores){

		System.out.println("哈希查找算法");
		return 0;
	}
}

class ScoreManager{

	protected float[] scores = new float[3];
	protected int count = 0;
	protected LookupArithmetic arithmetic;

	public void setArithmetic(LookupArithmetic arithmetic){

		this.arithmetic = arithmetic;
	}

	//添加
	public void add(float item){

		if (count == scores.length) {
			
			int newLength = 2 * scores.length;
			scores = Arrays.copyOf(scores, newLength);
		}

		scores[count] = item;
		count++;
	}

	//查找最大值
	public float max(){

		return arithmetic.loopup(scores);
	}

}




<think>好的,我需要帮助用户在Java中使用和实现策略设计模式。首先,我要回忆一下策略模式的基本概念。策略模式属于行为型设计模式,主要用于定义一系列的算法,将它们封装起来,并且使它们可以互相替换。这样可以在运行时动态地改变对象的行为。 根据用户提供的引用内容,策略模式的结构主要由环境类(Context)、抽象策略类(Strategy)和具体策略类(ConcreteStrategy)成。环境类负责维护一个策略对象的引用,并可以切换策略。抽象策略类定义算法接口,具体策略类实现这些接口的不同算法。 接下来,我需要考虑如何在Java中具体实现这些件。首先,创建一个策略接口(对应抽象策略类),然后编写多个具体策略类实现该接口。环境类则包含一个策略接口的引用,并通过构造方法或setter方法注入具体的策略对象。 用户可能还需要知道策略模式的优缺点。优点包括避免多重条件判断,符合开闭原则,易于扩展。缺点是客户端必须了解所有策略类,且可能产生大量类。引用中提到可以通过享元模式减少对象数量,这也值得提及。 应用场景方面,策略模式适用于需要动态切换算法的情况,比如不同的支付方式、排序算法选择等。需要结合引用中的例子,比如引用[2]和[5]提到的避免if else和使用场景。 然后,我需要编写一个代码示例,展示策略模式的实现。比如,支付策略的例子,定义PaymentStrategy接口,然后实现CreditCard、Alipay、WeChatPay等具体策略类。环境类PaymentContext使用策略对象来执行支付。 最后,生成相关问题,确保符合用户要求的问题类型,比如优缺点、优化方法、与其他模式的区别等。 检查引用内容是否准确,确保引用标识正确对应。例如,策略模式的结构部分引用[5],优缺点引用[2][3],应用场景引用[2][4][5]等。 总结步骤:结构讲解、优缺点、应用场景、代码示例、相关问题。确保每个部分都有引用支持,并且自然标注引用标识。</think>### Java策略设计模式详解 策略设计模式通过**封装算法族**实现动态切换行为,是替代多重条件判断的典型解决方案[^5]。以下是具体实现步骤: #### 一、核心结构 1. **策略接口**(Strategy) 定义算法的公共接口,例如: ```java public interface PaymentStrategy { void pay(double amount); } ``` 2. **具体策略类**(ConcreteStrategy) 实现不同算法: ```java // 信用卡支付 public class CreditCardStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("信用卡支付:" + amount); } } // 支付宝支付 public class AlipayStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("支付宝支付:" + amount); } } ``` 3. **环境类**(Context) 持有策略引用并执行策略: ```java public class PaymentContext { private PaymentStrategy strategy; public PaymentContext(PaymentStrategy strategy) { this.strategy = strategy; } public void executePayment(double amount) { strategy.pay(amount); } } ``` #### 二、使用示例 ```java public class Client { public static void main(String[] args) { // 动态切换支付方式 PaymentContext ctx = new PaymentContext(new CreditCardStrategy()); ctx.executePayment(100.0); // 输出:信用卡支付100.0 ctx = new PaymentContext(new AlipayStrategy()); ctx.executePayment(200.0); // 输出:支付宝支付200.0 } } ``` #### 三、模式特性 | 优点 | 缺点 | |------|------| | 消除多层条件判断[^2] | 客户端需了解所有策略类[^3] | | 符合开闭原则 | 类数量可能过多 | | 算法复用性高[^4] | 增加对象间通信成本 | #### 四、应用场景 1. 需要动态切换算法(如支付方式、排序算法) 2. 存在大量条件分支的代码块 3. 需要隔离算法实现细节的场景 #### 五、优化方案 1. **结合享元模式**:共享无状态策略对象减少实例数量 2. **使用依赖注入**:通过Spring等框架自动管理策略对象 ```java // 享元模式示例 public class StrategyFactory { private static final Map<String, PaymentStrategy> strategies = new HashMap<>(); static { strategies.put("ALIPAY", new AlipayStrategy()); strategies.put("CREDIT_CARD", new CreditCardStrategy()); } public static PaymentStrategy getStrategy(String type) { return strategies.get(type); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值