策略模式
1、策略模式:将不同的策略封装在不同类的某个方法中(具体策略实现类)。将这个方法抽象成一个接口的方法(抽象策略类)。用一个具体策略对象来配置,维护一个对策略对象的引用(环境类)。客户端调用环境类( 调用者)。
要完成一个目标可以有多个算法:
1.要把多个算法抽象成一个接口
2.每种算法用一个实现类来定义具体的实现
4.调用实现类的具体实现方法
5.使用方选择具体的算法实现
案例 :
场景如下,刘备要到江东娶老婆了,走之前诸葛亮给赵云三个锦囊妙计,说是按天机拆开能解决棘手问题。场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。
抽象策略类(Strategy)
- public interface Strategy {
- public void operate();
- }
三个实现类(ConcreteStrategy):
妙计一:初到吴国
- 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 BlackEnemy implements IStrategy {
- @Override
- public void operate() {
- System.out.println("孙夫人断后,挡住追兵");
- }
- }
环境类(Context)
- 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 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");
- }
- }