设计模式——策略模式

策略模式

定义

策略模式(Strategy Pattern)也称为(Policy Parttern)。
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换

优缺点、应用场景

优点

  1. 算法可以自由切换。这是策略模式本身的定义,只要实现抽象策略就可以作为一个“策略”
  2. 避免使用多重条件判断。可以减少if-else的使用
  3. 拓展性良好。

缺点

  1. 策略类数量增多,且可复用性小
  2. 所有策略都要对外暴露。上层模块必须知道有哪些策略,然后才能决定使用,幸运的是可以使用其他模式来修正这个缺陷,如:工厂方法模式、代理模式、享元模式

使用场景

  1. 多个类只有在算法和行为上稍有不同的场景
  2. 算法需要自由切换的场景
  3. 需要屏蔽算法规则的场景

代码模拟场景

《三国演义》中刘备前往东吴联姻,诸葛亮派子龙随从,担心主公有失,便给子龙三道锦囊,在紧急时候依次打开

策略模式

  1. 策略模式有两个角色:抽象策略角色(Strategy)和上下文角色(Context)
  2. 抽象策略角色负责管理具体的策略
  3. 上下文对象负责管理抽象策略,屏蔽高层模块对策略、算法的直接访问

UML图

在这里插入图片描述

抽象策略角色与实现类

/**
 * 策略接口
 */
public interface IStrategy {
	// 每个策略必有一个执行的方法
	public void operate();
}

/**
 * 找乔国老开后门
 */
public class BackDoor implements IStrategy {
	@Override
	public void operate() {
		System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
	}
}

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

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

上下文角色

/**
 * 锦囊
 */
public class Context {
	private IStrategy strategy;
	// 构造函数,需要使用哪个策略
	public Context(IStrategy strategy){
		this.strategy = strategy;
	}
	// 使用策略
	public void operate(){
		this.strategy.operate();
	}
}

入口类

public class ZhaoYun {
	public static void main(String[] args) {
		Context context;
		// 刚到吴国时拆第一个
		System.out.println("-----初到吴国启用第一个策略-----");
		context = new Context(new BackDoor());
		context.operate();
		// 刘备乐不思蜀时
		System.out.println("-----刘备乐不思蜀启用第二个策略-----");
		context = new Context(new GivenGreenLight());
		context.operate();
		// 孙权追兵赶来
		System.out.println("-----孙权追兵赶来启用第三个策略-----");
		context = new Context(new BlockEnemy());
		context.operate();
	}
}

结果

在这里插入图片描述

策略模式(策略枚举)

  1. 将策略方法结合枚举final + static 的特点,可以用于变动率不高的策略的场景
  2. 策略枚举的逻辑更加贴近现实世界的逻辑

策略枚举

枚举类

/**
 * 策略枚举
 */
public enum Calculator {
	// 加法运算
	ADD("+") {
		public int exec(int a,int b){
			return a+b;
		}
	},
	// 减法运算
	SUB("-"){
		@Override
		public int exec(int a, int b) {
			return a-b;
		}
	};
	String value = "";
	// 定义成员值类型
	private Calculator(String Value) {
		this.value = value;
	}
	// 获得枚举成员的值
	public String getValue(){
		return this.value;
	}
	// 声明一个抽象函数
	public abstract int exec(int a ,int b);
}

入口类

/**
 * 策略枚举入口类
 */
public class StrategyEnumMain {
	public static void main(String[] args) {
		int a = Integer.parseInt(args[0]);
		String symbol = args[1];
		int b = Integer.parseInt(args[2]);
		System.out.println("输入的参数为:" + Arrays.toString(args));
		System.out.println("运行结果为:" + a+symbol+b + "=" + Calculator.ADD.exec(a,b));
	}
}

结果

在这里插入图片描述
在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加把劲骑士RideOn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值