设计模式、系统设计 record part01
技术路线:
工程师==》设计师==》分析师==》架构师
管理路线:
项目经理==》技术经理
工程师:
编程技术、测试技术
设计师:
工程师+设计技术
分析师:
设计师+分析技术
架构师:
分析师+架构技术
项目经理:
时间管理、风险管理、计划管理、过程管理、成本管理、人际沟通
技术经理:
项目经理+领导能力
具备技术素质:
高级技术人才
具备管理素质:
高级管理人才
同时具备技术、管理素质:
高级综合人才
参考书推荐:
head first design patterns(设计模式)
大话设计模式(Java溢彩加强版)
图解设计模式(中国工薪出版集团、人民邮电出版社)
前辈们代码设计经验
,解决特定问题的一系列套路
,
好的、坏的设计特征
Robert C.Martin
面
向对象
的设计原则:
单一职责
-Single Responsibility Principle:
职责
《== 原因,应该有且仅有一个原因
,引发类的变更
功能 约等于 方法
仅有一个原因
,引发类的变更,
根据这个案例,如果只设计了一个类(员工类),那么,诱发类的变更就有很多原因,
比如要修改收银员的数据就要动这个员工类,要修改接待员的数据也要动这个员工类,要修改厨师的数据也要动这个员工类,所以出现了修改这个员工类会有n个原因,这就违反了SRP,
所以改进的方法是,为每一个工种设置一个类,这样,当要去动某个类的时候,只有一个与其对应的原因,
比如要修改餐服员的数据,只要去动餐服员的类就行,而不需要去管其他工种的类。
这里可以使用粒度
这个词来描述职责,
多职责的粒度就是粗的,
单一职责的粒度就是细的。
DAO
(Data Access Object)
把访问数据库的代码封装起来,DAO在数据库与业务逻辑(Service)之间,
Entity层
,顾名思义就是实体层,放置一个个实体,及其相应的set、get方法。
如果想要对数据库进行一些操作(比如说读取)的话,就要先写entity层
Service
被称作业务逻辑层。
顾名思义,它处理逻辑上的业务,而不去考虑具体的实现
Servlet
(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容
Util
是utiliy的缩写,是一个多功能、基于工具的包。
如字符串处理、日期处理等,(建立数据库之间的连接),是通用的、与业务无关的,可以独立出来,可供其他项目使用
开闭
-Open Closed Principle:
开闭的关键是抽象,
开闭是面向对象设计的终极目标,
开放是,对程序中需求频繁变化部分
进行抽象。
里氏替代
-Liskov Substitution Principles:
依赖倒置
-Dependence Inversion Priciple:
依赖正置
: 面向实现。模块之间的依赖,依赖的是实现类
依赖倒置: 面向抽象。模块之间的依赖,依赖抽象在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
依赖倒转的中心思想是面向接口编程(这句话的意思就是,把具体的n 个实现
类抽象成 1 个接口
,1:n 【n 个实现类
】到 1:1【1 个接口
】)
以抽象的基础搭建的架构比以细节为基础的架构要稳定的多,
抽象不应该依赖细节,细节应该依赖抽象
接口或抽象类,不涉及任何具体的操作,把展现细节的任务交给接口(或抽象类)的实现类去完成
september2024the26Thursday
依赖正置,一个类a去引用其他的类(类b、类c),
依赖倒置,针对类b、类c,抽象出来一个接口,类b、类c都继承(implement)这个接口,然后类a去引用这个接口,这就是倒置,
换句话说,打个比方,正置的时候,类a直接去和类b、类c吵架,倒置的时候,类a骂的是类b、类c的爸爸(接口),所以是倒过来的,是指爹骂(不是直接骂儿子,骂的是爹【引用类b、类c的爹】,让儿子自己去体会【类b、类c去 implement 继承它们的爹】)儿子,
正置的时候,类a要去挨个引用其他类,
倒置的时候,类a只引用一个接口,n多的其他类去自动继承接口,这样类a不用关心继承接口的有多少个其他类,只要这些类都继承类a引用的那个接口,类a就能使用这些个类。
接口分离
-Interface Segregation Principle:
可以看到,上图中,将打电话、发短信、拍照三个方法集成到一起了,这时候,apple手机有能力使用它的三个功能,而老年机实际上并不需要拍照功能,但开发的时候是将三个功能集成到一起了,这时候,老年机用户就被迫依赖了一个并不需要的拍照方法,
解决办法:
把打电话、发短信、拍照做成3个接口,iPhone就调用3个接口,老年机就调用除了拍照以外的打电话、发电信这两个接口,
不要强迫老年机用户依赖他们并不需要的摄像头拍照方法,
迪米特
-Law of Demeter:
一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,需要变动的模块的扩展会相对容易。
再举一个例子:
军队里面有元帅、军官和士兵,元帅认识军官,军官认识自己管辖的士兵。
要发动攻击,元帅不必直接对士兵下命令,只需要下命令给军官,再由军官将指令转发给所辖士兵即可。
合成复用
-Composite Reuse Priciple:
上面这个例子说的是,继承父类时能拿到父类的方法method1、method2,但是拿不到父类的其他子类的方法,因此是不能重用父类的子类的代码,
举个栗子:
我在csdn‘程序员胖虎’的博客里找到几个图,看起来比较好理解,如下:
继承
:
给继承加元素.
合成
:
给合成加元素,
合成的扩展性更好些。
找了一圈,‘程序员胖虎’的这个似乎更贴切些,咱们先用着,有时间我再研究研究,又更好的再来更新。
再来一个例子:
来自csdn‘这很张扬’的博客,下图是一个合成复用的图
下面是一个继承复用的图
再举一个例子:
一个父类,如下:
父类里有两个方法,method1、method2,
子类1,如下:
复写了父类的method2,变成了它自己的方法method2
子类2,如下:
第3个子类,如下:
复写了父类的method1、method2,变成了自己的method1、method3,
最后,用一个测试类进行测试,如下:
测试类,结果如下:
最后这个例子不太好,给人感觉莫名其妙的,不妙不妙,我再想想,等有更好的例子再来更新。
September2024the26thWednesday