公用技术——设计模式14——行为型模式——策略模式

1、概念

为了实现相同的目标,提出了不同的解决方案,策略模式的目的是用户可以动态的在这些解决方案中来回切换。

也可以表述为:

为了实现相同的功能,提出了不同的算法,策略模式的目的是用户可以动态的在这些算法中来回切换。

具体到代码,接口用户封装功能,不同的接口实现类提供不同的算法。

策略模式的实现方式是IOC,依赖注入,接口定义在编译阶段,在运行阶段决定注入哪种实现类,以提供其对应的算法实现。

2、UML图

3、代码

  Client

/**
 * 
 * @File Name: Client.java
 * @Description: 用户类,他想解决某种问题
 * @version 1.0
 * @since JDK 1.8
 */
public class Client {
	// 依赖注入,构造器,属性,方法参数都可以
	private IPlan plan;

	// 解决某种问题,Iplan接口的实现类提供解决方案
	public void solveProblem(IPlan plan) {
		this.plan = plan;
		plan.provideSolution();
	}
}

  IPlan接口类,它封装解决方案的功能。

/**
 * 
 * @File Name: IPlan.java
 * @Description: 计划接口类,它用于封装解决方案
 * @version 1.0
 * @since JDK 1.8
 */
public interface IPlan {

	void provideSolution();
}

  PlanA接口实现类,PlanB与PlanC类与之类似,此处省略

/**
 * 
 * @File Name: PlanA.java 
 * @Description: 接口实现类,提供A解决方案
 * @version 1.0
 * @since JDK 1.8
 */
public class PlanA implements IPlan {

	@Override
	public void provideSolution() {
		System.out.println("执行A计划");
	}
}

4、讨论

 

问题1:注入功能接口(此例中为IPlan)的方式?

 

答:大部分项目普遍都采用Spring框架,spring框架的注入方式有三种,构造器,属性,工厂方法参数。其中自动注入依赖的方式居多,采用属性的方式居多,例如此例中

 

  • IPlan接口作为Client的属性,并在属性上添加@Autowire注解。
  • PlanA,PlanB,PlanC类上添加@Service注解。
  • 由于自动注入方式是根据byName方式查找依赖的,所以属性的名称必须是planA,planB或planC,否则根据byType方式查找会报错。

 

5、示例

 集合的排序功能,参数为Comparator接口。

原文地址:https://www.cnblogs.com/rain144576/p/9940882.html