设计模式之策略模式(Strategy Pattern)

本文深入解析策略模式,一种常用的设计模式,通过定义一组算法并封装它们,使得算法可以在运行时自由切换。文章通过代码示例详细介绍了策略模式的三个关键角色:Context、Strategy和ConcreteStrategy,展示了如何在不同策略间进行灵活选择。
  • 策略模式定义
    策略模式是一种比较简单的设计模式,也叫做政策模式,策略模式的核心就是面向对象的继承和多态机制。Define a family of algorithms, encapsulate each one, and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
  • 策略模式通用类图
    在这里插入图片描述
    策略模式的三个角色:
    • Context封装角色:起到承上启下的作用。屏蔽了高层模块对策略、算法的直接访问。
    • Strategy抽象策略角色:策略、算法的抽象,通常为借口,定义每个策略、算法必须有的方法和属性。
    • ConcreteStrategy具体策略角色:实现 Strategy抽象策略角色,包含具体的算法。
  • 策略模式通用代码
    抽象策略借口
public interface Strategy {

	void sth();
}

封装角色

public class Context {

	private Strategy strategy = null;

	public Context(Strategy _strategy) {
		this.strategy = _strategy;
	}

	/**
	 * 封装后的策略方法
	 */
	public void doAnything() {
		this.strategy.sth();
	}
}

具体策略实现

public class ConcreteStrategy1 implements Strategy{

	@Override
	public void sth() {
		
		System.out.println("策略算法实现1。。。");
	}
}

public class ConcreteStrategy2 implements Strategy{

	@Override
	public void sth() {
		
		System.out.println("策略算法实现2。。。");
	}
}

调用类

public class Client {

	public static void main(String[] args) {

		Strategy strategy = new ConcreteStrategy1();
		
		Context context = new Context(strategy);
		
		context.doAnything();
	}
}

输出结果

策略算法实现1。。。

实例我暂时没有想到太好的,所以套用一下书中的例子。

  • 策略模式实例代码
    抽象策略
public interface Strategy {

	void operate();
}

锦囊

public class Context {

	private Strategy strategy;

	// 构造函数,要你使用哪个妙计
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}

	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}

	public void operate() {
		this.strategy.operate();
	}
}

具体策略类

public class GivenGreenLight implements Strategy {
	@Override
	public void operate() {
		System.out.println("求吴国太开个绿灯,放行");
	}
}

public class BlackEnemy implements Strategy {
	@Override
	public void operate() {
		System.out.println("孙夫人断后,挡住追兵");
	}
}

public class BackDoor implements Strategy {
	@Override
	public void operate() {
		System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");
	}
}

调用类(周瑜)

public class Zhaoyun {

	public static void main(String[] args) {
		Context context;

		System.out.println("----------刚到吴国使用第一个锦囊---------------");
		context = new Context(new BackDoor());
		context.operate();
		System.out.println("\n");

		System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");
		context.setStrategy(new GivenGreenLight());
		context.operate();
		System.out.println("\n");

		System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
		context.setStrategy(new BlackEnemy());
		context.operate();
		System.out.println("\n");
	}
}

输出结果

----------刚到吴国使用第一个锦囊---------------
找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备


----------刘备乐不思蜀使用第二个锦囊---------------
求吴国太开个绿灯,放行


----------孙权的追兵来了,使用第三个锦囊---------------
孙夫人断后,挡住追兵
  • 策略模式的优缺点
    • 策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。
    • 可扩展性强,增加一个新的策略对策略模式来说非常容易。
    • 策略类过多的时候不易维护。
  • 策略模式使用场景
    • 当几个类的具体逻辑(算法)相同的时候,只在小部分地方有区别可以考虑策略模式。
    • 有几种相似的行为(算法),客户端需要动态地决定使用哪一种,那么可以使用策略模式。

参考书籍:设计模式之禅
实例代码放在这里

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值