java23种设计模式(不断更新中)
⼊门
1、⽬的是使软件⼯程在维护性,扩展性,变化性,复杂度⽅⾯成O(N)。
娱乐明星绯闻2、⾯向对象是原则,设计模式是具体⽅法,⼯具
⾯向对象有三⼤特性和六⼤原则:
蔡依林倒带歌词三⼤特性:继承、封装、多态
六⼤原则:
1、单⼀职责原则(⾼内聚):
就⼀个类⽽⾔,应该只有⼀个引起它变化的原因。简单来说,⼀个类应该是⼀组相关性很⾼的函数和数据的封装。
2、开闭式原则:
软件中的对象应该对扩展是开放的,但是,对修改是关闭的。简单来说,就是将功能模块以接⼝的⽅式来调⽤,对功能进⾏抽象化,并且外部能够实现该功能(接⼝)。
3、迪⽶特原则(最⼩知道原则):
⼀个对象应该对其他对象有最⼩的了解。即类和类直接应该建⽴在最⼩的依赖之上,⼀个类应该对其依赖的类有最⼩的了解,即只需要知道其所需要的⽅法即可,⾄于其内部具体是如何实现的则不⽤关⼼。
4、⾥⽒替换原则:
所有引⽤基类的地⽅都必须能够透明的使⽤其⼦类。⾥⽒替换原则通过建⽴抽象,让⾼层次模块依赖于抽象类,在运⾏时再替换成具体的实现类,保证了系统的扩展性和灵活性。(⼀个接⼝(功能),多个实现类(实现⽅法))
5、依赖倒置原则:
1、⾼层次模块不应该依赖低层次模块的具体实现,两者都应该依赖其抽象。
2、抽象不应该依赖细节。
3、细节应该依赖抽象。
总结: ⾯向接⼝编程,或者说⾯向抽象编程。
解决类与类间的依赖,造成的耦合
6、接⼝隔离原则:
类间的依赖关系应该建⽴在最⼩的接⼝之上。接⼝隔离原则将⾮常庞⼤、臃肿的接⼝拆分成更⼩更具体的接⼝。⼀个接⼝定义的过于臃肿,则代表它的每⼀个实现类都要考虑所有的实现逻辑。接⼝定义要⼩,但是要有限度,对接⼝细化可以增加灵活性,但是过度细化则会使设计复杂化。
设计的分析⽅法
crazy horse⾯向对象的⼀些问题
1、继承的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。影响会有溢出效益。
2、超类挖的⼀个坑,每个⼦类都要来填,增加⼯作量,复杂度O(N^2)。不是好的设计⽅式。
分析⽅法
1、分析项⽬变化与不变部分,提取变化部分,抽象成接⼝+实现;
如:鸭⼦哪些功能是会根据新需求变化?叫声、飞⾏。。。
好处:新增⾏为简单,⾏为类更好的复⽤,组合更⽅便。既有继承带来的复⽤好处,没有挖坑。
⼀策略模式
原理:
分别封装⾏为接⼝,实现算法族,超类⾥放⾏为接⼝对象,在⼦类⾥具体设定⾏为对象。原则就是:分离变化部分,封装接⼝,基于接⼝编程各种功能。此模式让⾏为算法的变化独⽴于算法的使⽤者。
1、根据⾏为编写接⼝,创建多种⾏为⽅式的实现类。
胡思乱想歌词2、在实体中声明对应⾏为的接⼝,⽤相应⾏为的实现类实现实体的⾏为。
类似:开闭式原则 + ⾥⽒替换
注意与总结
郭沁1、分析项⽬中变化部分与不变部分
2、多⽤组合少⽤继承;⽤⾏为类组合,⽽不是⾏为的继承。更有弹性。
谢霆锋的小三
3、有哪些库或框架本⾝就是⽤某种设计模式设计的
List对象
Android 设配器
个⼈总结:有点像那些机器⼈的组合,可以⽤不同类型的⼿臂,代替当前的⼿臂
⼆观察者模式
模拟使⽤⽓象局提供的api接⼝通常:
观察者:
原理:
定义:对象之间多对⼀依赖的⼀种设计⽅案,被依赖的对象为Subject,依赖的对象Observer,Subject通知Observer变化。体现了:⾥⽒替换原则、依赖倒置(将两个⾓⾊抽象成观察者与被观察者)
⽰例演⽰:
⼀、观察员接⼝
⼆、被观察者接⼝
三、继承实现观察员接⼝
观察员可以有多个,观察者模式也是为了多对⼀设计的
四、实现被观察者接⼝