策略模式(Strategy Pattern)(一):策略模式介绍

策略模式定义了算法族,通过抽象策略接口封装不同算法,并在上下文中动态切换。这种模式避免了使用条件语句,提高了代码的灵活性和可扩展性。适用场景包括需要多种算法选择的情况。其优点包括代码重用、易扩展,但可能导致更多的类需要维护。设计原则包括封装变化、多用组合、针对接口编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、意图


    定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。



二、适用性


1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。


三、组成


——抽象策略(Strategy)角色:定义了所有算法的一个公共接口,各种不同的算法(即具体策略)以不同的方式实现这个接口,一般使用接口或抽象类实现。


——具体策略(Concrete Strategy)角色:提供了具体的算法实现。


——环境(Context)(或应用场景、上下文)角色:内部维护一个策略类的实例,可在运行时动态设定算法(具体策略),负责跟Strategy之间的交互和数据传递。



四、结构




五、简单实现


以实现整数的加减乘除为例,定义四种具体策略:加、减、乘、除。


(1)抽象策略(Strategy)角色:

public interface Strategy
{
  public int calculate(int a,int b);
}

(2)四种具体策略(Concrete Strategy):


“加”策略:

public class AddStrategy implements Strategy
{
  @Override
  public int calculate(int a, int b)
  {
	return a+b;
  }
}

“减”策略:

public class SubtractStrategy implements Strategy
{
  @Override
  public int calculate(int a, int b)
  {
	return a-b;
  }
}

“乘”策略:

public class MultiplyStrategy implements Strategy
{
  @Override
  public int calculate(int a, int b)
  {
	return a*b;
  }
}

“除”策略:

public class Dividetrategy implements Strategy
{
  @Override
  public int calculate(int a, int b)
  {
	return a/b;
  }
}

(3)环境(Context)角色:

public class Context
{
	//持有一个策略类的引用
	private Strategy strategy;

	public Strategy getStrategy()
	{
		return strategy;
	}

	//以便于动态设置具体策略
	public void setStrategy(Strategy strategy)
	{
		this.strategy = strategy;
	}

	public Context(Strategy strategy)
	{
		this.strategy = strategy;
	}
	public int calculate(int a,int b)
	{
		return strategy.calculate(a, b);
	}
}

测试:

public class Client
{
  public static void main(String[] args)
  {
	
	Strategy  addStrategy=new AddStrategy();
	Context context=new Context(addStrategy);
	
	int result=context.calculate(10, 7);
	System.out.println(result);
	
	Strategy multiplyStrategy=new MultiplyStrategy();
	//动态设置算法
	context.setStrategy(multiplyStrategy);

	result=context.calculate(10, 7);
	System.out.println(result);
  }
}


六、策略模式的优缺点


1.优点


(1)提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。


(2)避免了程序中使用多重条件转移语句来选择不同的行为(策略),将行为封装在一个个独立的Strategy类中消除了这些条件语句。使系统更灵活,并易于扩展。


(3)遵循了封装变化、多用组合少用继承、针对接口编程等面向对象设计的原则。


2.缺点


(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。


(2)Strategy和Contex t之间的通信开销,有时Context会创建和初始化一些ConcreteStrategy永远不会用到的参数


(3)每一个策略(算法)都对应一个策略类,增加了需要维护的类的数量。


解决办法:使用工厂方法模式。



七、设计原则


(1)封装变化


(2)多用组合,少用继承


(3)针对接口编程,不针对实现编程


关于这三个设计原则的体现,可以参考《HeadFirst设计模式》使用策略模式设计鸭子



转载请注明出处:http://blog.youkuaiyun.com/jialinqiang/article/details/8870060

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值