【设计模式】策略模式

1.UML

针对同一个算法/业务有不同的实现,在不同情况下使用不同的实现。
image

//定义算法接口
abstract class Strategy
{
	public abstract void Algorithm();
}

//封装算法实现1
class ConcreteStrategy1:Strategy
{
	public override void Algorithm(){}
}

//封装算法实现2
class ConcreteStrategy2:Strategy
{
	public override void Algorithm(){}
}

//封装算法实现3
class ConcreteStrategy3:Strategy
{
	public override void Algorithm(){}
}


class Context
{
	private Strategy st;	//封装算法对象
	
	public Context(Strategy _st)
	{
		st = _st;
	}
	
	public void DoAlgorithm()
	{
		st.Algorithm();
	}
}
Context ct = new Context(new ConcreteStrategy2());	//具体执行的算法由传入Context构造的类实例决定

ct.DoAlgorithm();	//算法的执行统一为DoAlgorithm()

和简单工厂的对比:

image

简单工厂,重点在将switch判断new不同具体类的过程封装。依赖所有具体类。客户端中获取实例。

策略模式,重点在将算法类/业务类的实例封装,通过方法调用,对外暴露一个统一的调用算法的接口,客户端通过调用这个接口调用算法,屏蔽调用不同算法时调用不同接口。
调用不同算法时,将不同的算法类的实例传入Context的构造函数。

2. 策略模式和简单工厂结合

策略模式,将决定使用什么算法的判断switch放在了客户端中,由客户端通过传入什么算法类的实例决定使用什么算法。增加了客户端和各种算法类的耦合,当增加算法实现时客户端的switch将会增加。
利用简单工厂的思想,将判断使用什么具体算法类的过程封装在Context类中。不再向Context的构造传入不同实例,而是传入switch的case,在构造中创建具体算法类的实例。

class Context
{
	private Strategy st;	//封装算法对象
	
	public Context(string _case)
	{
		switch _case
		{
			case "1":
				st = new ConcreteStrategy1();
			case "2":
				st = new ConcreteStrategy2();
			case "3":
				st = new ConcreteStrategy3();
		}
	}
	
	public void DoAlgorithm()
	{
		st.Algorithm();
	}
}
Context ct = new Context("2");

ct.DoAlgorithm();	//客户端使用算法还是使用统一的接口

好处:客户端彻底与具体的算法类解耦,连与抽象算法类Strategy都解耦了(Strategy对象封装在了Context中)。
但是,策略模式和简单工厂的结合,增加算法/业务实现时,还是要修改Context类。

posted @ 2023-06-01 18:18  neon233  阅读(7)  评论(0编辑  收藏  举报