设计模式有什么用
面试的时候会被问到。当然,这的确是一个作用。
还是先从“模式”这个概念说起,每一个大类的问题都会有自己的模式,比如生活中教育孩子,有自然生长模式,有专制型模式、有溺爱型模式等,在教育孩子的落地实践上自觉不自觉的都落到了某个模式里面。
在我们学习的软件技术中,比如分布式系统环境下,处理高可用问题,我们在数据库上采用主从复制模式,在应用服务的性能上采用本地缓存模式、分布式缓存模式等等。
上面说的这两个例子里面的模式,从某个严格意义上来讲跟23种设计模式还不是完全一样,但是他们解决问题的方式都是一样的,而且都是让你高效地解决问题。
“模式”本身就是对曾经发生过的和正在发生的问题的解决方法的提炼总结。所以,当我们说出某个模式名称的时候,大家会一下子关联或者联想到具体的行为方式。
哦,你一说,你教育孩子的方式属于溺爱,大家就都懂了。你一说数据库采用主从复制,大家也都懂了。
怎么样才叫学会设计模式了呢,我看到一种说法觉得还挺有道理,“设计模式要是真的学会了,你们会发现在写代码的时候,脑子里根本没有什么设计模式,你都已经融会贯通了”。
是不是像张无忌学太极一样,忘了就是学会了。
做设计的时候,我们都会告诉自己,程序设计要对修改关闭,对扩展开放,这是我们设计程序的最终目标。
可如何来实现这个目标呢。
设计模式可以帮助我们实现。
它可以帮助我们组织我们的代码,来进行对代码解耦,来实现对修改关闭,对扩展开放的效果。你可以写出扩展性好、维护性好的高质量代码,会潜移默化影响你的开发能力。
采用正交分解的设计方式,最重要的一个设计步骤就是要留好代码的扩展点(一个接口或者一个抽象),哪些地方以后可能要修改,哪些地方以后不能改。在那些以后可能要修改的地方,也就是我们预留好了扩展点的地方,到时候只需要按照既定套路来使用设计模式来写出来就好了。
问题1:讲了这么多好处,那到底我们要怎样才能学会设计模式呢?
答案只有一个,就是创造条件去使用设计模式。很多人总是觉得,要通过简单的程序和例子来学设计模式。这是不对的。设计模式就是因为情况复杂了所以才会出现的,所以我们只能通过复杂的程序来学习设计模式。你不管看别人的程序也好,自己写程序练习也好,那必须要复杂,复杂到你不用设计模式就做不下去,这才能起到学习设计模式的作用。
这就是你为什么读了很多设计模式的书籍,却还是用不好设计模式的原因之一。大多数书籍里面的例子都非常简单,比如形状啊、猫和狗啊什么的。当然,这样的例子可以帮助你快速理解设计模式的原理,但是现实情况是比这些例子复杂的多的多的真实情况。
问题2:用设计模式一定有很大的作用吗?
辩证的看问题,任何事物都有两面,有好的一面,也有不好的一面。设计模式也一样。不过,设计模式好的一面比不好的一面要大。
有一句话说的是,“历史在发生时未被发现,在发现时已被重组”。那么模式的产生实际上是“方法在发生时已被发现,在发现时已被使用”。
PO、DO、DTO、VO这四个对象我每次都要互相转换吗
在分层的web架构里面,我们始终绕不开四个对象,那就是PO、DO、DTO、VO,详细解释一下,PO是数据库持久化对象(Persistent Object),DO是领域对象(Domain Object),DTO是数据传输对象(Data Transfer Object),VO是视图对象(View Object)。
这四个对象分别隶属于不同的层,分层的目的之一是隔离关注点,这样每一层“只负责自己关心的事情”。
比如在DDD分层结构中,一般会分为基础层、领域层、应用层、用户接口层。在领域层主要的操作对象是DO,该对象作为数据和行为的载体。那么到了用户接口层,操作的主要对象是DTO,该对象作为数据组装和传输。那么为了上述所说的隔离关注点,以便保持各层模型的稳定和独立,则需要将DO和DTO进行转换。
问题3:PO DO DTO VO分别处于不同的层,层与层之间进行调用的时候,都需要在每层之间进行转换吗?
回答这个问题,就需要结合我们刚才谈到的,他们被定义为四个对象分别在独立的层中使用的目的,就是保持层与层之间的解耦,每一层模型的稳定独立。如果层与层之间的模型差异性不大,则是可以不做转换的,毕竟转换一次也要消耗些性能。
控制反转并不是一种编程技巧而是一种设计思想
控制反转(Inversion Of Control,缩写为 IOC)是一种设计思想,而不是一种具体的技巧。
是将对程序流程的的控制权从程序员“反转”到了框架。比如你亲自写了一个man方法,在里面去串起来流程的执行,变成了你写了一个框架,只需要将对象注入到这个框架里面就能够起到和之前一样的效果。
实现这个思想的方法才是技巧。比如上面说的写了一个框架,比如我们说的依赖注入DI(Dependency Injection,缩写为 DI),它可以不通过new()对象的方式在内部创建依赖对象,而是变成了将所要依赖的对象在外部创建好以后,通过构造函数、函数传参的方式传递给其它类使用,注意这里的传递,就是我们说的注入。
这里的DI就是一种控制反转技巧。通过依赖注入技巧实现了控制反转的设计思想。
另外,市面上有很多通过依赖注入技巧实现了控制反转的框架,比如我们非常熟悉的Spring IOC框架,它的控制反转主要是通过依赖注入来实现的。
我们只需要通过依赖注入框架提供的扩展点,简单配置一下所有需要创建的类对象、类与类之间的依赖关系,就可以实现由框架来自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。
问题4:除了依赖注入的方式,还有哪些技巧可以实现控制反转吗?
其实还有模板模式等。
学习参考资料:
https://zhuanlan.zhihu.com/p/19835717
https://time.geekbang.org/column/article/177444?cid=100039001
----END----
这里记录,我每周碰到的,或想到的,引起触动,或感动的,事物的思考及笔记。不见得都对,但开始思考记录总是好的。