草庐IT

【设计模式】责任链模式,让程序员摆脱乱糟糟的零散的代码

奇想派之博客 2023-03-28 原文

?‍♂️ 个人主页:奇想派

?‍? 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 ?️!

?️学海无涯苦作舟,?️编程之路无悔路!

? 如果文章对你有帮助的话,欢迎评论?点赞?收藏?加关注,不胜感激!

? 更多内容,点击链接扫码关注公众号?编程达人

责任链模式&函数式编程在java中的实践

在java中借用javascript大规模使用的functional programming

基础思想-函数式编程

什么是函数式编程?
  • 函数式编程是一种编程的范式(A programming paradigm.)。就像面向过程面向对象。总的来说,Function is King,函数为王。

  • 函数式编程是一种思维模式。该使用什么样的方式去解决你的问题?就像你不想去破解一个代码块完整性(内聚),那么你可以加入一个切面,去影响该代码块的执行结果。

为什么要函数式编程?
  • Object-oriented in javascript gets tricky. 在复杂的处理过程中,java的面向对象也许不能很好处理繁琐,复杂得业务逻辑,对象往往纠缠不清。
  • Safer, easier to debug/maintain. 可维护性更高。
如何去函数式编程?
  • Do everything in function:以函数方式思考。对于一个业务逻辑,如果以函数的角度思考,那么可以抽离出若干的函数进行处理,而非乱糟糟的零散的代码

  • 规定好Input/Output。一个函数规定好IO,就能去更好地承接上下游业务,更好地区分模块。

  • 下面就是标准的函数式编程

var name = "alan";
function greet(){  
    name = "jade";  
    return "Hi,I'm "+name;
}
function sayMyName(name){  
    return "Hi,I'm "+name;
}
greet();
sayMyName(name);
=> "Hi,I'm alan "

责任链模式在jdk8中的实践

在有了上面的函数式编程的思想,接下来结合jdk的Function语法糖,可以产生很强的实战性代码

下面以一个 赚钱---> 买西红柿 ----> 洗西红柿 ----> 切西红柿----> 煮西红柿 的例子。

完整的例子

public class PipleLineTest {
    static class Money{}
    static class RawTomato{}
    static class CleanTomato{}
    static class TomatoSlice{}
    static class CookedTomato{}

    final static Supplier<Money> makeMoney = ()->{
        System.out.println("我要努力赚钱买西红柿!!");
        Money money = new Money();
        System.out.println("赚到钱了,返回一堆钱");
        return money;
    };

    final static Function<Money,RawTomato> buyRawTomato = (money)-> {
        System.out.println("去市场买西红柿!");
        final RawTomato rawTomato = new RawTomato();
        System.out.println("买好西红柿了,得到了一个有泥的西红柿,需要洗一下,回家!");
        return rawTomato;
    };

    final static Function<RawTomato,CleanTomato> cleanTomato = (rawTomato)-> {
        System.out.println("回到家,准备洗西红柿!");
        final CleanTomato cleanTomato1 = new CleanTomato();
        System.out.println("洗好西红柿了!返回一个干净的西红柿");
        return cleanTomato1;
    };

    final static Function<CleanTomato,TomatoSlice> cutTomato = (cleanTomato)-> {
        System.out.println("准备切西红柿!");
        final TomatoSlice tomatoSlice = new TomatoSlice();
        System.out.println("切好西红柿了!返回西红柿切片");
        return tomatoSlice;
    };

    final static Function<TomatoSlice,CookedTomato> cookTomato = (tomatoSlice)-> {
        System.out.println("准备烹饪西红柿!");
        final CookedTomato cookedTomato = new CookedTomato();
        System.out.println("西红柿了煮好了!返回了一个煮好的西红柿,开饭!");
        return cookedTomato;
    };

    public static void main(String[] args){
        final Money money = makeMoney.get();
        buyRawTomato
                .andThen(cleanTomato)
                .andThen(cutTomato)
                .andThen(cookTomato)
                .apply(money);
    }
}

由上面可以看出,【煮西红柿】这个完整的步骤每一个步骤的输入输出都非常明确,维护的时候,就可以清晰看到哪个步骤需要调整/修改了。并且强制你去思考输入输出,会规范你的代码,提高可读性。

总结

使用函数式编程,可以很好地模块化每个步骤的代码。而责任链可以很好地承接我们的业务逻辑,而JDK8的函数式语法糖就赋予这2个思想很好实践的能力。

?博主个人博客网站:奇想派

?文章首发平台:微信公众号【编程达人】

?原创不易!各位小伙伴觉得文章不错的话,可以关注我,进行评论?点赞?收藏?三连走起!谢谢大家!

有关【设计模式】责任链模式,让程序员摆脱乱糟糟的零散的代码的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  5. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  8. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  9. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐