【设计模式】使用策略模式(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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当代码中的条件语句if-else过于复杂时,可以考虑使用设计模式代替if-else语句,提高代码的可读性和可维护性。以下是一些常见的设计模式,可以用来代替if-else语句: 1. 工厂模式(Factory Pattern):通过工厂方法创建对象,而不是使用条件语句来直接创建对象。这样可以避免在代码中使用大量的if-else语句,同时也可以很方便地添加新的对象类型。 2. 状态模式(State Pattern):将复杂的状态判断逻辑封装到不同的状态类中,避免在代码中使用大量的if-else语句。可以很方便地添加新的状态类型,也可以方便地维护和扩展状态的行为。 3. 策略模式Strategy Pattern):将不同的算法封装到不同的策略类中,通过选择不同的策略类来实现不同的行为。这样可以避免在代码中使用复杂的if-else语句,同时也可以很方便地添加新的算法类型。 4. 观察者模式(Observer Pattern):将一个对象的状态变化通知给多个观察者对象,避免在代码中使用大量的if-else语句。可以很方便地添加新的观察者对象,也可以方便地维护和扩展观察者的行为。 5. 责任链模式(Chain of Responsibility Pattern):将多个处理对象组成一个链,每个处理对象都可以处理请求,如果一个对象不能处理请求,则将请求传递给下一个处理对象。这样可以避免在代码中使用大量的if-else语句,同时也可以很方便地添加新的处理对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值