来源:https://www.cnblogs.com/yjmyz...java8提供的很多新特性可以用来重构传统设计模式中的写法。下面是一些例子:1.上图是策略模式的类图,假设我们现在要保存订单,OrderService接口定义了要做什么,NoSqlSaveOrderStragegy和MySqlSaveOrderStrategy提供了两种策略,即保存到nosql数据库和传统的mysql关系型数据库,最后在OrderServiceExecutor中通过构造函数注入最终要使用的策略。传统写法,这个场景至少需要4个类,代码如下:OrderService接口:publicinterfaceOrderService{voidsaveOrder(StringorderNo);}orderNo){System.out.println("订单:"+orderNo+"保存到mysql");}}Nosql策略实现publicclassNoSqlSaveOrderStrategyimplementsOrderService{@OverridepublicvoidsaveOrder(StringorderNo){System.out.println("order:"+orderNo+"保存到nosql");}}SpringBoot的基础就不介绍了,推荐这个实用教程:https://github.com/javastacks...辅助“容器”使用策略publicclassOrderServiceExecutor{privatefinalOrderServiceservice;publicOrderServiceExecutor(OrderServiceservice){this.service=service;}publicvoidsave(StringorderNo){this.service.saveOrder(orderNo);}}运行测试类:publicclassOrderServiceTest{publicstaticvoidmain(String[]args){OrderServiceExecutorexecutor1=newOrderServiceExecutor(newMySqlSaveOrderStrategy());executor1.save("001");OrderServiceExecutorexecutor2=newOrderServiceExecutor(newNoSqlSaveOrderStrategy());executor2.save("002");进入两个策略实现类,代码如下:保存到mysql"));executor1.save("001");OrderServiceExecutorexecutor2=newOrderServiceExecutor((StringorderNo)->System.out.println("order:"+orderNo+"保存到nosql"));executor2.save("002");}学习资料分享:https://www.javastack.cn/study/二、模板方法类图如下,核心思想是在抽象中定义一些通用的标准方法父类,只定义方法签名,实现逻辑交给子类。例如:在会员系统中,每个商家都会有一些营销活动,需要向会员推送一定的信息,但不同的商家推送的内容可能不同。有的需要推送优惠券,有的需要打赏。抽象模板类:publicabstractclassAbstractPushTemplate{publicvoidpush(intcustomerId,StringshopName){System.out.println("Readytopush...");执行(客户编号,商店名称);System.out.println("推送完成\n");}abstractprotectedvoidexecute(intcustomerId,StringshopName);}优惠券具体模板,你好,"+shopName+"送你一张优惠券");}}积分具体模板publicclassPushScoreTemplateextendsAbstractPushTemplate{@Overrideprotectedvoidexecute(intcustomerId,StringshopName){System.out.println("Member:"+customerId+",hello,"+shopName+"发送你10分");}}使用示例:AbstractPushTemplatetemplate1=newPushCouponTemplate();template1.push(1,"CandyStore");AbstractPushTemplatetemplate2=newPushScoreTemplate();template2.push(1,"服装店");显然,模板的实现越多,子类就越多减少到1个,参考如下:.println("准备推送...");Object[]param=newObject[]{customerId,shopName};执行。接受(参数);System.out.println("推送完成\n");}}借助Consumer函数接口,需要实现子类,具体实现留待使用时决定,如:newPushTemplateLambda().push(1,"CandyStore",(Object[]obj)->{System.out.println("会员:"+obj[0]+",你好,"+obj[1]+"送你一张优惠券");});newPushTemplateLambda().push(1,"服装店",(Object[]obj)->{System.out.println("会员:"+obj[0]+",你好,"+obj[1]+"送你10分”);});3.观察者模式思路:基于某个Subject对象,然后一堆观察者向该对象注册,当有事件发生时,该对象会根据注册列表通知所有观察者。观察者接口:publicinterfaceObserver{voidnotify(StringorderNo);}另外,Java系列面试题和答案都整理好了,微信搜索Java技术栈,后台发送:面试,可以看在线的。主题接口:publicinterfaceSubject{voidregisterObserver(Observero);voidnotifyAllObserver(StringorderNo);}Subject接口实现:publicclassSubjectImplimplementsSubject{privatefinalListlist=newArrayList<>();@OverridepublicvoidregisterObserver(Observero){list.add(o);}@OverridepublicvoidnotifyAllObserver(StringorderNo){list.forEach(c->c.notify(orderNo));}}两个观察者的实现:OrderObserver:publicclassOrderObserverimplementsObserver{@Overridepublicvoidnotify(StringorderNo){System.out.println("Order"+orderNo+"状态更新为【已支付】");}}StockObserver:publicclassStockObserverimplementsObserver{@Overridepublicvoidnotify(StringorderNo){System.out.println("Order"+orderNo+"仓库已通知发货!");}}测试一:staticvoidtest1(){Subjectsubject=newSubjectImpl();subject.registerObserver(新订单观察者());subject.registerObserver(newStockObserver());subject.notifyAllObserver("001");}用java8重构后接口可以提供默认的实现方法,我们新建一个subject接口publicinterfaceNewSubject{Listlist=newArrayList<>();默认voidregisterObserver(Observero){list.add(o);}默认voidnofityAllObserver(StringorderNo){list.forEach(c->c.notify(orderNo));}}使用:staticvoidtest2(){NewSubjectsubject=newNewSubject(){};subject.registerObserver((StringorderNo)->System.out.println("Order"+orderNo+"状态更新为【已支付】"));subject.registerObserver((StringorderNo)->System.out.println("Order"+orderNo+"仓库已通知发货!"));subject.nofityAllObserver("002");}只使用这两个接口实现观察者模式。四、责任链/责任链模式的核心思想:每个处理环节都有一个“指针”指向下一个处理者,类似于链表。处理器接口:publicinterfaceProcessor{ProcessorgetNextProcessor();voidprocess(Stringparam);}抽象实现类publicabstractclassAbstractProcessorimplementsProcessor{privateProcessornext;publicAbstractProcessor(处理器处理器){this.next=processor;}@OverridepublicProcessorgetNextProcessor(){返回下一个;}@Overridepublicabstractvoidprocess(Stringparam);}定义2个具体的实现}@Overridepublicvoidprocess(Stringparam){System.out.println("处理器1正在处理:"+param);如果(getNextProcessor()!=null){getNextProcessor().process(param);}}}及publicclassProcessorImpl2extendsAbstractProcessor{publicProcessorImpl2(Processornext){super(next);}@Overridepublicvoidprocess(Stringparam){System.out.println("处理器2正在处理:"+param);如果(getNextProcessor()!=null){getNextProcessor().process(param);}}}使用示例:staticvoidtest1(){Processorp1=newProcessorImpl1(null);处理器p2=newProcessorImpl2(p1);p2.process("somethinghappened");}用java8重构后只需要一个新接口@FunctionalInterfacepublicinterfaceNewProcessor{Consumerprocess(Stringparam);}同样的效果可以写的很简洁:staticvoidtest2(){Consumerp1=param->System.out.println("处理器1正在处理:"+param);Consumerp2=param->System.out.println("处理器2正在处理:"+param);p2.andThen(p1).accept("somethinghappened");}andThen自然是另一种getNextProcessor表达重要提示:什么时候用lambda什么时候不用看情况。如果处理逻辑比较简单,可以使用lamdba进行重构,让代码更加简洁易读。如果处理逻辑复杂,你还是应该用“类”。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!