java8 策略模式_《Java8实战》 - 8.2.1 使用 Lambda 重构面向对象的设计模式 之 策略模式...

1. 啥是策略模式?

https://www.runoob.com/design-pattern/strategy-pattern.html 程序可以在运行时,动态地决定需要使用哪种策略来处理业务操作. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护,并且难以在运行时动态调整(动态调整:这就需要一些技巧)。

1. 定义策略模式的主接口、两个实现类

public interface UploadStrategy {

void upload();

}

---

public class FtpUploadStrategy implements UploadStrategy {

@Override

public void upload() {

System.out.println("==========ftp文件开始上传……");

}

}

---

public class OssUploadStrategy implements UploadStrategy {

@Override

public void upload() {

System.out.println("==========oss文件开始上传……");

}

}

2. 定义动态环境UploadContext类 —— 动态感知环境变化,动态调整需要实现的策略类,这部分可以交给SpringBoot的@PostConstructor来根据xml配置文件来动态初始化选择

public class UploadContext implements UploadStrategy {

private UploadStrategy uploadStrategy;

public UploadContext(UploadStrategy uploadStrategy) {

this.uploadStrategy = uploadStrategy;

}

@Override

public void upload() {

uploadStrategy.upload();

}

}

3. 主测试类

public class Main {

private UploadContext uploadContext;

@Test

public void strategyTest() {

uploadContext = new UploadContext(new OssUploadStrategy());

uploadContext.upload();

uploadContext = new UploadContext(new FtpUploadStrategy());

uploadContext.upload();

}

}

测试结果

==========oss文件开始上传......

==========ftp文件开始上传......

4.使用 Lambda 重构面向对象

/**

* 使用lambda表达式进行简化 不需要新增新的实现类,就可以轻松添加策略,比如下面的第三种策略"hdfs文件开始上传"

*/

@Test

public void strategyLambdaTest() {

uploadContext = new UploadContext(() -> System.out.println("==========oss文件开始上传......"));

uploadContext.upload();

uploadContext = new UploadContext(() -> System.out.println("==========ftp文件开始上传......"));

uploadContext.upload();

uploadContext = new UploadContext(() -> System.out.println("==========hdfs文件开始上传......"));

uploadContext.upload();

}

缺点: lambda表达式可以简化的前提是UploadStrategy 只有一个接口方法,即函数接口,大于一方法lambda表达式会失效;这种简化其实就是把实现方法提前写在了lambda表达式中

其他:实际使用还是需要灵活调整,设计模式是为了重构具体的代码耦合问题,是为了解决问题的!不是纯粹的为了炫技巧,代码安全性和易读性也是需要考虑和权衡的。

还可以融合springboot,发挥一些web的独特特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值