【设计模式】使用策略模式(Strategy Pattern)重构if-else多分支结构

目录

 

一.介绍

二.场景

三.常规判断选择策略

四.策略模式选择策略

1.定义玩耍策略接口

2.定义玩耍的具体策略实现类

3.定义策略查看类

4.执行

五.demo代码


一.介绍

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

二.场景

  今天周末,想约几个朋友出来玩,但是朋友不一定都能约出来,那么有3种玩耍的方案,也就是策略

   一个人玩游戏

   两个人打台球

   三个人唱歌

 

当然实际应用中,具体策略逻辑肯定不只是简单打印一句话,如果只是这么简单的逻辑,不必要使用设计模式了

三.常规判断选择策略

public class Main {
    public static void main(String[] args) {
        //i代表人数
        int i = 3;
        if(i==1){
            System.out.println("一个人,打游戏");
        }else if(i==2){
            System.out.println("两个人,打台球");
        }else if(i==3){
            System.out.println("三个人,唱歌");
        }

      

    }
}

 

四.策略模式选择策略

1.定义玩耍策略接口

/**
 * 玩耍的抽象策略接口
 */
public interface PlayStrategy {

    /**
     * 玩什么
     */
    void toPlay();
}

 

2.定义玩耍的具体策略实现类

/**
 * 打游戏的具体策略
 */
public class GameStrategy implements  PlayStrategy {
    @Override
    public void toPlay() {
        System.out.println("一个人,打游戏");
    }
}

 

/**
 * 打台球的具体策略
 */
public class BilliardsStrategy implements  PlayStrategy {
    @Override
    public void toPlay() {
        System.out.println("两个人,打台球");
    }
}

 

/**
 * 唱歌的具体策略
 */
public class SingStrategy implements  PlayStrategy {
    @Override
    public void toPlay() {
        System.out.println("三个人,唱歌");
    }
}

 

3.定义策略查看类

/**
 * 策略查看类,负责执行
 */
public class PlayStrategyContext {
    private PlayStrategy strategy;

    public PlayStrategyContext(PlayStrategy strategy){
        this.strategy = strategy;
    }

    public void executeStrategy(){
        strategy.toPlay();
    }
}

4.执行

public class Main {
    public static void main(String[] args) {
        //i代表人数
        int i = 3;
      

        //策略模式
        PlayStrategyContext context = null;
        if(i==1){
             context = new PlayStrategyContext(new GameStrategy());
        }else if(i==2){
            context = new PlayStrategyContext(new BilliardsStrategy());
        }else if(i==3){
            context = new PlayStrategyContext(new SingStrategy());
        }
        if(context != null){
            context.executeStrategy();
        }

    }
}

五.demo代码

https://download.csdn.net/download/corleone_4ever/12462639

你可能感兴趣的:(java,设计模式)