概述
策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。
策略模式的主要角色如下。
抽象策略(Strategy)类:公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
环境(Context)类:持有一个策略类的引用,最终给客户端调用。
讲人话
:
- 1、是讲某一种事件中的各种行为抽象到接口中,对于不同的人干这同一种事情会有不同的结果。
- 2、电商整个环境去不同的渠道干同样的事:抽象下单,售后,物流,商品同步。。。
- 3、代码模拟,以吃鸡的m4和awm为例
coding
package com.xusj.future.behavioral.strategy;
/**
* 抽象出策略,抽象出具体的一些行为,游戏中枪
*
* @author xusj
* <br>CreateDate 2022/8/5 23:38
*/
public interface GameStrategy {
/**
* 打架
*/
void fight();
/**
* 防御
*/
void defense();
}
package com.xusj.future.behavioral.strategy;
/**
* 枪。m4
*
* @author xusj
* <br>CreateDate 2022/8/5 23:41
*/
public class M4a1strategy implements GameStrategy {
@Override
public void fight() {
System.out.println("我是枪m4战斗力");
}
@Override
public void defense() {
System.out.println("m4防御值");
}
}
package com.xusj.future.behavioral.strategy;
/**
* 枪AWM
*
* @author xusj
* <br>CreateDate 2022/8/5 23:42
*/
public class AwmStrategy implements GameStrategy {
@Override
public void fight() {
System.out.println("我是AWM战斗力111000000000");
}
@Override
public void defense() {
System.out.println("我是AWM防御力111000000000");
}
}
package com.xusj.future.behavioral.strategy;
/**
* 环境游戏类,组合策略。环境类重要,后面都是通过环境类来执行策 略的
*
* @author xusj
* <br>CreateDate 2022/8/5 23:45
*/
public class ContextGame {
// 属性组合
private GameStrategy gameStrategy;
// 构造器多态
public void setGameStrategy(GameStrategy gameStrategy) {
this.gameStrategy = gameStrategy;
}
public void startGame() {
System.out.println("游戏开始.....");
//游戏策略
gameStrategy.fight();
gameStrategy.defense();
System.out.println("win......");
}
}
package com.xusj.future.behavioral.strategy;
/**
* @author xusj
* <br>CreateDate 2022/8/5 23:48
*/
public class MainTest {
public static void main(String[] args) {
// 使用环境类去完成不同的策略
ContextGame contextGame = new ContextGame();
// 策略一
contextGame.setGameStrategy(new M4a1strategy());
contextGame.startGame();
// 策略二
contextGame.setGameStrategy(new AwmStrategy());
contextGame.startGame();
}
}
使用场景
什么场景用到?
使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句
什么是Spring的 InstantiationStrategy
线程池拒绝策略
…
总结
策略模式本身比较好理解,但通常其并不单独使用,而是结合工厂模式进行使用,本文中的实例利用枚举,其实也是工厂的一种简单表示
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96206.html