java8提供了很多新的特性,可以用来重构传统设计模式中的写法。下面是一些例子:1.策略模式上图是策略模式的类图。假设我们现在要保存订单,OrderService接口定义了Whattodo,而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+"savetonosql");}}辅助“容器”使用策略: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");}}重构后可以省去2个策略实现类,代码如下::"+orderNo+"保存到mysql"));executor1.save("001");OrderServiceExecutorexecutor2=newOrderServiceExecutor((StringorderNo)->System.out.println("order:"+orderNo+"保存到nosql"));executor2.save("002");}2模板方法类图如下。核心思想是在抽象父类中定义一些通用的标准方法,只定义方法签名,将实现逻辑交给子类。比如:在会员系统中,每个商家都会有一些营销活动,需要推送一些信息给会员,但是不同的商家可能会推送不同的内容,有的需要推送优惠券,有的需要积分通知。抽象模板类:publicabstractclassAbstractPushTemplate{publicvoidpush(intcustomerId,StringshopName){System.out.println("Readytopush...");执行(客户编号,商店名称);System.out.println("推送完成\n");}abstractprotectedvoidexecute(intcustomerId,StringshopName);}优惠券特定模板;publicclassPushCouponTemplateextendsAbstractPushTemplate{@Overrideprotectedvoidexecute(intcustomerId,StringshopName){System.out.println("Member:"+customerId+",你好,"+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,参考如下:out.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主题,然后在subject上注册一堆观察者Observer,当有事件发生时,subject根据注册列表通知所有观察者。观察者接口:publicinterfaceObserver{voidnotify(StringorderNo);}Subject接口: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+"状态更新为【已付款】");}}股票观察者;publicclassStockObserverimplementsObserver{@Overridepublicvoidnotify(StringorderNo){System.out.println("Order"+orderNo+"仓库已通知发货!");}}测试一:staticvoidtest1(){Sub项目主题=新的SubjectImpl();subject.registerObserver(newOrderObserver());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("订单"+orderNo+"状态已更新为[已支付]"));subject.registerObserver((StringorderNo)->System.out.println("Order"+orderNo+"仓库已通知发货!"));subject.nofityAllObserver("002");}只用了2个接口来实现Observer模式4.Responsibilitychain/责任链模式核心思想:每个处理环节都有一个“指针”指向下一个处理器,就像一个链表。处理器接口:publicinterfaceProcessor{ProcessorgetNextProcessor();voidprocess(Stringparam);}抽像实例:publicabstractclassAbstractProcessorimplementsProcessor{privateProcessornext;publicAbstractProcessor(处理器处理器){this.next=processor;}@OverridepublicProcessorgetNextProcessor(){返回下一个;}@Overridepublicabstractvoidprocess(Stringparam);}定义2个具体的实现:publicclassProcessorImpl1extendsAbstractProcessor{publicProcessorImpl1(Processorprocessor){super(processor);}@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("processor1is处理:“+参数);Consumerp2=param->System.out.println("处理器2正在处理:"+param);p2.andThen(p1).accept("somethinghappened");}andThen自然是另一个getNextProcessor这种表达式的重要提示:什么时候用lambda,什么时候不用,看情况。如果处理逻辑比较简单,可以使用lamdba进行重构,让代码更加简洁易读。如果处理逻辑复杂,还是应该用“类”。