如何使用策略模式,优化代码里的if-else?

什么是策略模式

策略模式属于行为型模式,类的行为可以根据不同的策略在运行中更改。

策略模式的作用

策略模式主要解决了使用if-else所带来的复杂性和难以维护的问题。


策略模式的架构图

在这里插入图片描述

  • Strategy(策略接口) :定义抽象的行为方法
  • OperationAdd、OperationSubtract、OperationMultiply(这三个为具体的策略类):实现抽象的策略方法
  • Context(环境):运行特定的具体策略类,可以根据不同的策略做出对应策略类的行为

消息推送相信大家都已经不陌生了,消息一般包括:短信、email、钉钉机器人消息、企业微信等等…当我们在企业中需要集成多种消息类型时可能会通过使用if-else判断发送不同的消息,下面分别介绍if-else写法和利用策略模式的写法

  • if-else的实现写法
// 消息策略接口
public interface  MessageStrategy {

  // 定义消息的行为
  void send(String message);
}


// 发送短信消息的实现类
public class ShortMessageStrategy implements MessageStrategy {

  @Override
  public void send(String message) {
    System.out.println("发送短信"+message);
  } 
}

// 发送邮件的实现类
public class EmailStrategy implements MessageStrategy  {

  @Override
  public void send(String message) {
    System.out.println("发送邮件"+message);
  }
}

// 运行
public static void main(String[] args) {
	Integer sendType = 1;

	if(SendType.SHORT_MESSAGE.getType().equals(sendType)){
	  // 发送短信
	  ShortMessageStrategy shortMessageStrategy = new ShortMessageStrategy();
	  shortMessageStrategy.send("Hello msg");

	}else if (SendType.EMAIL.getType().equals(sendType)){
	  // 发送邮件
	  EmailStrategy emailStrategy = new EmailStrategy();
	  emailStrategy.send("Hello email");
	}
	// ......省略更多的发送方式
}

if-else写法方式的缺点:需要存在多种发送方式时代码整体会显得非常长,让人看着不舒服,扩展性差,耦合度高

  • 策略模式的写法
// 消息策略接口
public interface  MessageStrategy {

  // 定义消息的行为
  void send(String message);
}


// 发送短信消息的实现类
public class ShortMessageStrategy implements MessageStrategy {

  @Override
  public void send(String message) {
    System.out.println("发送短信"+message);
  } 
}

// 发送邮件的实现类
public class EmailStrategy implements MessageStrategy  {

  @Override
  public void send(String message) {
    System.out.println("发送邮件"+message);
  }
}


// 运行环境上下文,控制传入不同的策略行为也随之变化
public class Content {

  private static final Map<Integer, MessageStrategy> strategies = new HashMap<>();

  static {
    strategies.put(1,new ShortMessageStrategy());
	strategies.put(2,new EmailStrategy());
  }

  public static MessageStrategy getStrategy(Integer type){
    if (type == null){
	  throw new IllegalArgumentException("type should not be empty");
	}
    return strategies.get(type);
  }

}


// 运行
 public static void main(String[] args) {
  
	Integer sendType = 1;
	MessageStrategy messageStrategy = Content.getStrategy(sendType);
	messageStrategy.send("Hello");

 }

if-else写法方式
优点:1. 策略方式可以自由切换 2. 避免使用多重条件判断,代码看起来比较少易懂 3.解耦,扩展性比较好,加一个策略只需对应加一个策略类
缺点:需要定义多个策略类


总结

策略模式主要是针对不用的策略做出不同的行为,从而达到行为解耦,所以它属于一种行为型模式,我们要学习好策略模式的思想,设计模式不要为了用它而改变代码,需要结合实际的业务场景并且符合这种设计模式的思想才使用它。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值