初级JAVA程序员应该掌握的设计模式知识(超级通俗易懂)

为什么要学习设计模式?

别问,问就是面试需要。面试需要是最低层次的原因,再高一层次的原因是,设计模式就类似于一套在大部分时候都很有用的套路,使用设计模式之后,自己的代码往往更加有可读性,拓展性。当别的程序员看你写的代码的时候,他能很快的明白你的代码逻辑。再高一层次的原因自然就是这个是高级程序员的基本操作,总之,真的很重要哦。

对于想学设计模式的程序员来说,我的建议是先对Java的基本知识有所了解,甚至于比较熟悉之后,再看设计模式。不然的话,就可能印象不深刻。对于已经熟悉Java的基本知识的程序员,我的建议是直接看书,并认真做笔记。或者看下面我对每个设计模式的理解,遇到相似的问题的时候,尝试使用设计模式来实现需求。或者当你看完这本书,再看下下面我的理解,可以跟我交流一二,这样更好。

设计模式需要掌握哪些内容?

我认为,就是当你遇到一个具体问题,你可以很快的从自己的知识库中把自己知道的设计模式取出来,加上你自定义的设计模式,然后知道使用哪个设计模式,就可以了。以下是书里提到的几个重要的设计模式的简单介绍。

初级JAVA程序员系列

项目地址,欢迎STAR

策略模式

当你要实现多个具有相似行为的类时。你可以使用定义父类然后子类继承的方法,但这样做的时候,我们在实现子类的时候无形之中引入了可能不需要的父类的方法。

所以我们可以使用策略模式的思想来做同样的事情。策略模式的主要思想:多用组合,少用继承

我们可以将行为定义成接口,这样具有相似行为的类就可以做到类跟行为的接口,按需实现接口,也就是拥有行为。

观察者模式

观察者模式简单来说,思想大概就是你(观察者)关注(订阅)了某个公众号(主题对象),公众号发布新文章的时候,微信就会通知你,你就可以看到新的文章。

装饰者模式

装饰者模式的思想是:在不改变原有对象的基础之上,将功能附加到对象上,适合给类拓展功能的场景,且是一层套一层的。就像小时候学校里卖的饼一样。原价5元,装饰一层火腿肠,价格变为5+1元,在装饰一个鸡蛋,价格变为6+1元。

工厂模式

我琢磨了一下,我们玩王者荣耀时选英雄以及王者荣耀创建对应的英雄,生成地图,生成技能等过程应该算是一种工厂模式,首先B-P阶段,我们选择一个英雄名字头像,王者荣耀就要根据英雄名字来生产一个英雄,然后产生对应的英雄和相应的技能以及技能对应的效果。好,我现在出一个面试题,“请根据王者荣耀选英雄的过程,写出对应的工厂模式类图”。

直接上《Head First》时的笔记:
所有的工厂都是用来封装对象的创建;简单工厂虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦;工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法创建对象;所有工厂模式都通过减少应用程序和具体类的依赖促进松耦合;工厂方法允许类将实例化延迟到子类进行;工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。

单件模式

单件模式是一种节约系统资源,提高系统性能的一种手段,也有助于管理对象。例如我们的手机App,我们发现,每次打开的都是之前打开过的或者是新创建的App对象,如果每次我们每次点击图标,安卓系统都给我们new一个App对象,那必将造成资源的浪费,也不方便我们进行操作管理。

命令模式

假设有一个机器人要给你做饭,Ok,假设你可以通过语音控制它,你可以这样命令它:去切菜,去开火,去倒油,都放进去,给我炒他,铲子铲出来,送到客人那边去!机器人怎么会知道做饭呢,但是你通过这几个独立的命令就让他实现了做菜并送物的功能,如果你只执行最后一个命令:送到客人那边去!机器人就实现了送物机器人的功能。

适配器模式

在计算机领域有一句至理名言:遇到问题的时候,通过多加一层就可以解决。这一思想就类似我们的适配器模式。

这个大家应该都知道吧,就不多讲了。举个例子,Docker就是Linux和JVM之间的一层适配器,Docker真香!

模板方法模式

世界上的人可能有一个共性,就是早上吃饭,中午吃饭,晚上吃饭。每个人的一天里都有这样几个阶段。那一日三餐就是一个模版方法,其中每个人实现模版的具体方法又不一样。当然可能996的你顾不上吃早餐了,就相当于你实现模版方法的吃早餐的时候执行的是今天吃空气(必须实现模版方法,此时的你就类似于代码里抛出一个异常)。

可以参考我的这篇文章。

迭代器与组合模式

简单来说就是,你的代码用一个for循环做了一件事情,你的同事用while循环做了一件相似的事情,你还有一个同事,直接对每个过程手动遍历(例如手动调用xxList.get(0),xxList.get(1)…)这个时候呢,你的领导可能会写一个更加通用的代码来替代你们三个人的代码,他可能就会使用Iterator,所以他能成为领导嘛。

状态模式

我这篇文章除了模版模式和MVC模式之外,应该还用到了状态模式,就是定义不同发病阶段的状态,然后执行代码,感兴趣的可以详细看一下。

代理模式

什么是代理呢,比方说你自己写了一个软件,你想弄一个软件著作权的证,原本可能你需要跑到北京,自己要跑一系列复杂的程序,这可能是很麻烦的,后来有人告诉你,你可以在淘宝找个代理,把信息发给他,他就会帮你做这样一系列事情。最后,你在感知不到 的情况下办理了软件著作权,这就是通过代理。

代理模式的好处是当你要增加修改业务功能(上文中的弄一个软件著作权的证)时,在不改变原有对象的情况下(不去亲自跑),引入代理类实现(找代理帮你弄)。

Spring的面向切面编程也是基于动态代理来实现的。在使用Mybatis的时候,我们只实现了xxMapper接口,却直接快乐的CURD,这背后,也是通过动态代理生成代理类的方式实现的,这种坏处显而易见,不跳出舒适圈的人,最后可能还在快乐的CURD。而面试的时候,就比较吃亏了。

设计模式的共性

设计模式的共性就是他的六大基本原则:
单一职责原则:良好类的基础
开闭原则:让程序更加稳定灵活
里式替换原则:让类的拓展性更强大
依赖倒置原则:拥抱变化吧,程序员!
接口隔离原则:你实现你的,不必管我感受
迪米特原则:去拓展自己吧,程序员!

碎碎念

就像那句话,他们说这些设计模式你或多或少都遇到过,只是不知道他是设计模式罢了。

好像这几种设计模式我都见到或者用到过,真奇妙。

推荐书籍

《Head First设计模式》

猜你喜欢

转载自blog.csdn.net/qq_32648593/article/details/106507394