Java架构师设计思想


1 设计核心思想封装

在这里插入图片描述

首先我们来看一下什么是封装。那封装呢也叫做信息隐藏,或者说是数据访问保护。
在这里插入图片描述
那放到程序上来讲呢,就是隐藏类的属性,还有实现细节仅对外啊公开一些接口。那么外部呢就只能通过我这个类暴露的这些访问接口,按照我这个类提供的方式来访问我的内部信息或者数据。那么这样子的一种情况就叫做封装。

那作为做java的我们来讲啊,封装我们是非常非常熟悉的。那么一开始学java学面向对象就要讲了封装、继承和多态。
那接下来我们就来谈一谈到底面向对象当中封装的本质是什么。其实从字面意义上来理解,封装就是把什么东西包装起来,那进一步说就是一个封装体。事实上大家面向对象当中类是不是就是一个封装体?

JAVA封装的作用和含义:https://blog.csdn.net/ZGL_cyy/article/details/104120516
JAVA封装的使用:https://blog.csdn.net/ZGL_cyy/article/details/104120523
设计模式之门面模式与装饰器模式详解和应用:https://blog.csdn.net/ZGL_cyy/article/details/129073521

我们现在设计的这个东西,比方说是一个类,但其实呢它也是一个封装体。当这个地方啊,咱们也可以认为它是一个。那么大家想想那里面封装了什么呢?无外乎就是一些属性,就是一些数据。然后是方法其实可以代表它的功能,对吧?你看这里头封装了一堆的属性。那这个东西不就是数据吗?一堆的方法是不是就代表了功能?也就是说一个类它一定是封装了一定的功能的,这么一个封装体没问题吧?当然这个封装并不仅仅只是对一个类而言,那你可以扩大一点,以此类推,从设计的角度来看,那一个组件是不是一个封装啊,大家想想,比方说这个东西还是个封装体。只不过这回他是个主见了。那大家想想,他是不是也是个封装器。
在这里插入图片描述

只不过在这个里面它封装的不再是什么属性啊、方法呀这样子的东西,它里头封装的就是一个一个的。比方说我们就说是组件或者模块或者是类吧,那它这里头是不是就可以封装一些类,组件是一个封装体,那模块是不是一个封装体?子系统是不是一个封装体?系统是不是还是一个封装体?只是说范围大小不同而已。

所以大家会发现啊,封装是咱们做架构设计一个非常非常基础的,非常重要的思想。咱们再从另外一个角度来看一看类,它其实是代码功能的一个封装,或者说是一个聚合方式。那这个呢我们要说一下,没有面向对象之前,咱们叫做面向过程设计,或者叫过程化设计。那过程化设计呢大家可以理解成是这样。这里面有一堆的代码,能说这是过程化设计,那里面呢就一堆的代码,那这里头的代码呢我们称之为函数。或者说是一些过程吧,那这里头可能有函数一、函数二。或者我们也写成功能一、功能二、功能三这样子的。那么在过程化设计里面呢,这些功能都是比较散乱的堆放在一起。也就是说每一个功能自己就只管自己,它跟其他的没有什么天然的联系。那后来大家觉得说啊这样子去摆放代码非常的不友好。要想找一个功能,尤其是带流程的那就在里头跳来跳去非常的乱。那大家就想到一个办法说,我们把相关的一些功能,比方说哎发现这的一二三四五六七八是相关的,它们都是用来做比方说用户的一些什么数据的管理。

在这里插入图片描述

所以说呢从某种意义上说,类似代码的一种聚合方式一直在体现这个封装的思想。安全保护和复用这些核心的功能。除了这些呢,把这个包装起来的目的是为了可修改、可维护、可扩展。可维护。可扩展。那有的人说怎么还会可修改可维护呢?其实很简单,你看啊你把这些功能封装在这个比方说椭圆里面封装了一堆的功能过后,事实上这内部的功能和外部是不是就分开了你封装的这些功能是不是就可以单独的进行修改,进行维护,并且进行扩展。只要对外提供的接口不发生变化,那你封装起来的这一块实际上是不就可以随便改了。

所以说呢从某种意义上来说,封装的一个字也是封装了变化。就说封装的就是变化。但我觉得这一块以后可能会变,那我可以把这块先包装起来,那么以后的变化。就可以在。封装体内来实现。而不会啊影响到外部。

当这个呢跟咱们接下去要讲的一个思想隔离是息息相关的,或者是有类似之处的。
总之呢大家会发现封装对我们来讲是一个非常非常重要的思想,我们一定要重视对它的理解讲到这个地方。

2 设计核心思想隔离

我们把一定的功能做成一个封装体过后,这些功能的变化是不是就隐藏在这个封装体里面呢?前面讲到封装呢就是把这些变化给包装了起来。那么事实上咱们现在隔离也是为了把这些变化隔离开来。你看这有了封装过后,那么自然的就形成了封装体内和封装体外,天然就形成了一个隔离。就是把封装体内的这些功能的变化和封装体外要使用这些功能的地方隔离开来了,从而让内部的这些变化不会影响到外部调用它的地方。所以说隔离的就是变化。这些变化实际上封装在封装体里面。也就是说封装就是这些变化的东西。那么隔离呢就使得封装体内和封装体外调用这些功能的地方分隔开,使得调用这些功能的地方和封装体内功能具体的实现。
那肯大家就会在想,那为啥要隔离呢?

2.1 隔离的好处

实际上大家想一下,那么这么隔离了过后,那封装体内的这些具体的功能实现和封装体外的东西是不是就分离了。从而可以更好的实现高内聚低藕合,这就是隔离过后的好处。更好的实现高内聚。那么封装体内肯定是高内聚低耦合,那封装体外和封装体内的功能那就是一种低耦合。那么隔离呢不仅仅是只有这一点好处,它还能够提升系统架构,还有实现的灵活性。叫系统架构。
还有呢具体的一些实现的灵活性这个灵活性呢主要就体现在可维护可修改新增可扩展等等的。
大家都明白软件本身它是具有很大的不确定性的。所以说呢大家有这样一句话叫做设计,就是为了在不确定当中寻找确定,就软件设计吧。就是为了在不确定当中去。寻找确定。那对一个软件来说,不变的就是它的变化。听起来是不是有点绕口,也蛮有哲理的。也就是说一个软件一定要做的足够的灵活,要能够跟着需求的变化而不断的去演进。也就是在不确定当中,在不断的变化当中去寻找确定咱们很多的设计思想、设计方法。就是在教我们在面临不断的变化的过程当中,我们该怎么样去做咱们的软件体系结构,怎么样去做咱们的实现才是更好的。而封装和隔离呢就是帮助我们去解决这样子的问题的重要的一些设计思想。

封装和隔离这两个啊组合起来应该说可以称得上是软件设计最内核的思想。那么我们前面讲的封装。加上现在的这个隔离。
可以说呢是绝大部分设计思想的一个起点。事实上啊很多的架构模式、设计模式等等的,都是在教我们去做封装隔离。

架构模式和设计模式呢只是大家考虑的着眼点会不一样。架构模式呢可能会更高层一些,从整体上来考虑,而设计模式呢可能针对的功能会更小一些。但是它们的本质都是在教我们如何去应对变化。当我们发现了变化过后,咱们首先就要把这个变化封装起来,然后把它跟其他部分隔开,这样呢就能够实现啊彼此独立的变化。比方说架构模式里面的分层模式,常见的咱们分成表现层、逻辑层、数据层。大家想想这每一层实际上是不是一种封装。表现层你肯定不放数据层的处理的功能,也就是说表现层里面放的就是跟表现层控制层相关的一些内容。你看这本身就是一种封装。另外表现层和逻辑层之间的交互多半都是通过接口来进行的。也就是说每一层不但是一个封装体,它还要跟外部使用它的地方隔离开,彼此之间通过抽象来进行交互,本质上就是一种封装隔离思想。
所以说呢我们现在要认识到封装隔离思想的重要性。那么咱们在后面学习当中呢,会不断的去体会很多设计思想、设计方式,就是封装隔离这儿开始去思考的。

3 设计思想由大到小,由粗到精,逐步细化

3.1 由大到小

在这里插入图片描述

估计大家看到啊这几句话觉得看上去非常的简单,但是呢会感觉比较空洞,觉得听上去是那么回事。但是呢实际上可能不理解,也不知道怎么去做,这个啊是非常正常的。要真正理解和掌握这几句话是需要大量的实践和思考的那这里呢咱们先展开给大家讲述一下怎么去理解这几句话。先来理解从大到小,我们也把它称之为从外向内。大家试想一下,当我们去设计一个软件系统的高层价格的时候,我们一般来说首先是把系统当成一个黑盒来看待。也就是说什么都没有的就是要从零开始来设计,那大体上呢就是这个意思。你看啊,咱们这是人,如果我们现在去做一个软件系统的话,你看。那刚开始的时候这个软件系统是不存在的。

我们现在要来做设计嘛,就是从无到有,从零到一对吧?那么从这个软件系统外部来看,那这些呢是使用软件系统的一些角色。
这个时候他看到的就是一个黑盒嘛,也就是说这个时候他看到的在他的印象当中,软件就这么一个框框嘛。咱们可以这么形象的来理解,因为本质上来讲呢,这是个逻辑上的事情,并没有有形的框框。那咱们呢这样来表示一下,也就是说从系统外来看,系统这个时候是一个大黑盒,也就说看到的这个是最大的这个样子。那然后这个人呢就逐渐的啊,大家看就开始走走走走的子外部哎进到系统里面来了。那这个时候他就会发现在这个系统里面又有很多很多的小黑盒,也就是分成了很多子系统或者系统这样子的那就变成了这样,这里头呢可能会有这样一堆的子系统。

大家想想是不是这个道理。那么这个时候呢,他看到的哦,原来这个系统里头还有这么多东西,大概是这么个意思。这个时候呢,大家看一下,它可能就是这样了。然后呢就以此类推。你看这个人又从这一层然后往里走走走。
你看假如进到某一个子系统里面了,他又发现哎这个子系统里面就有一堆的这个模块。可能就是这样。那么随着这个越来越深入,那他看到的这个范围是不是就越来越小?

但是呢会看得越来越清楚,越来越明白。那么如果他再进到某一个这个模块里面,他就会发现这里面又有多少组件。
然后再进到某一个组件里面,他就会发现这里面包含多少功能。也就是说通过这样的方式,大大小小的就可以看到这个系统内部的一些组成结构。当然他他在这一层除了看到这个组结构有这么三个大子系统之外,他还会看到他们之间的关系。
那那么在这里看到模块也是一样的,那么他会看到哎这里面有几个模块,模块之间的关系是啥?然后进去再看到组件,他会会看到这一个组件,组件之间的关系是啥,以此类推,那这个就是咱们这讲的。从大到小。当然啊形象的看这个图呢也能理解成是从外向内。就是说每一次你看对于这个边界来说,那它就是外部。所以说它又从外到内,那么这样一层一层往下去细化,这个呢是咱们一个非常重要的设计思想。

3.2 由粗到精

在这里插入图片描述

如果我们把刚才这个过程就由大到小也好,由外向内也好,那么把这个逐渐由大到小审视系统内部的这个过程。
如果我们把它当成分层来看的话,你看它每一层它都要去考虑这部分具体的模块是多少
相互之间的关系是什么?
每个模块到底完成一些什么功能?
每个模块的边界到底是什么?
你看在这一层他是不是要把这些事情搞清楚。那然后呢它进化到这一层的时候,它又开始来考虑。
这两个组件到底是什么功能,相互之间什么关系?
那么每个组件的这个功能边界到底是什么等等的。以此类推,逐渐细化到内部的每一个功能。

那么咱们在做设计的时候,刚开始肯定就是一个粗略的设计,你看就是一个大框框,然后呢,就是大概定下来了啊这个系统大概有一些什么样的功能。然后再进一层层的时候,到这儿我我就知道我把我这个系统分成了三大子系统。那每个子系统大概都有一些什么功能,那么其他子系统的交互关系是什么样子的?
然后我进进到某一个子系统的内内部,那实际上是每个子系统内部都要设计,对吧?我就开始来考虑我这里面有多少个模块,模块之间的关系是啥,边界是啥等等的。那么随着咱们的视角从外向内,从大到小一层一层的审计,咱们的设计就会逐渐从粗略。走向精化,类似于刚开始只看见了一个轮廓,很粗略,然后一层一层的精华就会变得越来越清晰。慢慢的我们就可以看清楚整个软件体系里面的脉络还有纹路了。
这就是一个由粗到精的过程,也是啊咱们实际进行软件架构设计的一个过程。

3.3 逐步细化

在这里插入图片描述

事实上在这个由粗到精的过程当中啊,同时也是设计逐步细化的一个过程。因为我们先从粗略的大系统到子系统,然后再到里面的模块,再到里面的组件,最后到一个一个的功能块,然后再继续细化,就把每一个功能的落地实现都设计出来。那把这些东西都设计好了,细化好了,整体组合起来就是一个不错的架构设计了。所以说呢这三者啊其实是组合在一起的。因为你在从大到小的过程当中,你的设计就是在从粗到精,也是在逐步细化。所以说他们合起来,咱们认为是一个基本的设计思想。
另外呢大家可以理解咱这儿讲的这些东西,既是设计的思想,同时呢他也指导咱们设计的一个过程。

也就是说我们做架构设计的时候,其实大概过程也是这样,从大到小,由粗到精,逐步细化,直到最后把咱们整个软件里面所包含的这些功能都设计出来,那整个设计活动也就基本上ok了。
所以说呢,它也可以当成是咱们做架构设计的一个基本的方法。
事实上啊,这个方法并不仅限于高层架构设计阶段,包括后面的概要设计啊,详细设计呢,还有功能设计了等等的阶段,都可以基于这样的方法来做。只不过在不同的阶段,不同的层次,大家关注点不一样,仅此而已。
所以说咱们在理解这些东西的时候,是要从思想层面来理解,而不只是从这个字面上来理解这三句话。
好,有关于从大到小,由粗到精,逐步细化这个基本的这一思想呢,咱们就先讲到这个地方。

4 设计思想迭代

那任何事物都不是一蹴而就的,就说一下就把它做好。而迭代呢就是我们做事的一个基本方式。
那首先我们来看一下什么是迭代。那所谓迭代啊就是把大任务分成很多很多的小任务。那每次呢完成一定数量的小任务,这就算是一个迭代。那我们把所有的小任务都解决了,那这个大任务自然也就解决了,也就是逐步迭代来完成完整的大任务。
那用这个图来说,我们现在要完成的大任务呢就是这整个软件系统。
但是呢我们做的时候不是一上来就一步到位啊,把整个软件系统一下就做完,而是呢把它分成很多很多的小任务。大家可以想象成这每个子系统啊就是一个子任务。比方说我第一个迭代我就完成这个子系统,第二次迭代我完成这个子系统,第三次迭代我完成这个子系统。当然啊也包括它们相互之间的一些交互关系。那当我经历这么多次迭代过后,我就会发现哎,这整个大系统我解决完了。同样的道理啊,我在面对完成这一个子系统的时候,我又可以把它分成很多很多个模块。
那我第一次迭代完成这个模块,第二次迭代完成这个模块,那组合起来我就完成了这一个子系统。
同样道理,完成了这个子系统过后,我再去做第二个子系统、第三个子系统的迭代,最后完成整个系统,这个呢就是迭代。
当然啊迭代呢还有另外的一种方式,比如说吧我们现在有很多很多的任务要完成。
在这里插入图片描述

比如说我们现在要完成这个整体的大系统,但是呢它现在上来过后,大家看有很多很多的任务。
就比方说分了十个子系统,那么我们就会把这多个任务继续。分解成为更多的小任务。就比方说这个时候我没有这个框框,我一上来就是要完成这很多个子系统的任务。我对这每一个子系统呢再进行分解。分解了过后呢,可能就跟这样形成了很多的模块。
形成了很多的模块。但这里头呢,咱们可以调小一点儿。你看这是一个模块。但这些呢都可以调小一点,这里头呢我还可以有很多个这样的模块。就这个意思可以了吧,那这个呢也一样啊。ok那现在呢就把很多大任务,比方说我把这个先挪走吧,那就没有他了。就说我一上来就面临要做这么多大任务,那然后我把这些大任务呢你看又分成了很多很多的小任务。当可以一路的向下分解,然后我们对这些小任务来进行分组,把它算作一次迭代。就每次迭代呢是完成一组的任务,也就是说不像刚才我们是整个完成这一块儿,那现在呢我迭代的时候可能这样做。抽丝剥茧分析和思考咱们整个的这个架构设计。

4.1 和设计思想由大到小,由粗到精,逐步细化区别

虽然说思想由大到小,由粗到精,逐步细化里面也有一定的指导执行过程的这个意思,但是呢设计思想由大到小,由粗到精,逐步细化区别区别主要还是用来指导架构设计的。
所以这个啊大家一定要体会一下,它和迭代呢是有区别的。
迭代基本上主要的工作就是来关注做的过程,指导你在做的过程当中该怎么去做呢?你应该用迭代的方式做,而不是一步到位的方式来做。

5 总结

之前的文章定了学习的目标,就是要快速成长,成为合格的架构师。也明确了我们学习的方向,那就是对架构师的核心技能要求所涉及到的知识和技能。就是我们要学习和掌握的,也就是我们学习的方向。在学习的过程当中,我们深入了解了架构架构设计、功能设计、架构师等等的核心的概念。掌握了架构架构设计和架构师的关系。同时还去分析了开发人员和架构师的差距到底在哪儿,进一步明确了我们学习的方向。最后呢再去深入领悟了两个最重要的设计思想,一个是封装,一个是隔离。
然后去学习了两个重要的方法迭代,还有呢由大到小,由粗到精,逐步细化的这个方法。通过这一章的学习,我们从思想的层面上统一了认识,为后续的学习打下坚实的基础。

猜你喜欢

转载自blog.csdn.net/ZGL_cyy/article/details/133578404