策略模式相关

策略模式是一种行为型设计模式,它允许在运行时根据需要动态选择算法的行为。

1. 定义

策略模式(Strategy Pattern)定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

2.构成

(1)抽象策略角色(Strategy):通常由一个接口或抽象类实现,定义了一系列算法的公共接口。
(2)具体策略角色(ConcreteStrategy):实现了抽象策略角色定义的接口,提供了具体的算法实现。
(3)环境角色(Context):持有一个策略类的引用,负责和具体的策略类交互,通常具有一个方法来执行当前策略。

3. 应用场景

当需要在不同情况下使用不同的策略,或者策略可能在未来会有其他实现方式时,策略模式非常有用。
策略模式也用于对客户隐藏具体策略(算法)的实现细节,使得各种策略之间完全独立。

4. 优点

管理算法族:策略模式提供了一种管理多种相关算法的方法,通过继承可以共享公共的代码,避免重复。
替换继承:策略模式提供了替换继承关系的方法,使得算法或行为的使用者与算法或行为本身分离,从而可以独立地演化。
避免多重条件语句:使用策略模式可以避免使用难以维护的多重条件转移语句。

5. 缺点

客户端需知悉策略:客户端必须知道所有的策略类,并决定使用哪一个,这要求客户端对算法或行为有一定的了解。
类数量增加:策略模式可能导致产生大量的策略类,每个具体策略都会产生一个新类。

6.代码示例

抽象策略角色:

public interface Strategy{
	void execute(String mes);
}

具体策略角色:

public class StrategyA implements Strategy{
	    @Override
		public void execute(String mes){
      		System.out.println(mes)
   		}
}


public class StrategyB implements Strategy{
	    @Override
		public void execute(String mes){
      		System.out.println(mes)
   		}
}

环境角色:

public class Context{
	private Strategy strategy;

    Context(Strategy strategy){
    	this.strategy = strategy;
    }
    
	public void execute(String mes){
		this.strategy.execute(mes);
	}
}

使用:

public class Main{
   public static void main(String[] args){
  		Context context = new Context(new StrategyA());
  		context.execute("this is strategy A");
  		context = new Context(new StrategyB());
  		context.execute("this is strategy B");
	}
}

在策略模式中,决定参数应该如何传入取决于具体的情况和需求。一般来说,参数应该由新建策略对象时通过构造函数传入,这样可以确保在创建策略对象时就确定了相关参数,提高了策略对象的独立性和灵活性。
然而,在某些情况下,如果参数是在执行策略时才确定的,那么可以通过调用context的执行方法时传入参数。这种情况下,可能需要在context中存储参数,并在执行策略时将参数传递给具体的策略对象。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值