设计模式的目的
使程序拥有更好的的
- 代码复用性(一次编译,处处运行[手动狗头])
- 可读性(不可替代性堪忧呀)
- 可扩展性(新增功能时方便)
- 可靠性(新增功能后对旧功能没有影响)
- 高内聚,低耦合
设计模式的七大原则
设计模式的原则:设计"设计模式"时,遵守的原则,这样设计的依据
〇、设计模式核心思想
- 找出应用中可能需要变化之处,将其独立出来,不要和固定不变的代码混在一起
- 针对接口编程,而不是针对实现接口编程
- 为了交互对象之间的松耦合设计而努力
一、单一职责原则
即一个类只负责一个职责,如有多个职责应分为多个类
- 可以降低类的复杂性,一个类只负责一个职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应当遵守单一职责原则。当类足够简单时,可以下放到方法上遵守单一职责原则
二、接口隔离原则
一个类对另一个类的依赖应当建立在最小接口上
如存在一个接口Interface1
存在4个方法a()
、b()
、c()
、d()
,它有一个实现类Impl1
实现了它的四个方法。现存在类Class1
需要使用接口中的b()
和c()
方法,即Class1
依赖与Interface1
,使用uml类图表示如图
对于实现类Impl1来说,a()
和d()
方法没有被使用,可以无需实现,却必须要书写。此时出现代码的冗余。根据接口隔离原则,可以将Interface1
接口进行拆分
此时如果有另一个类需要使用b()
、c()
、d()
三个方法时,需要将上图中的Interface2
再拆分一次
至此,ClassA
对ImplA
的依赖,ClassB
对ImplB
的依赖,建立在最小接口上
三、依赖倒转原则
- 高层模块不应该依赖低层模块,二者都应该依赖其抽象
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒转的中心思想:面向接口编程
- 依赖倒转原则的设计理念:相对于细节的多变性,抽象的东西要更为稳定。以抽象为基础搭建的架构比以细节为基础的架构更为稳定。
- 使用接口或抽象类的目的是制定好规范,将展示细节的任务交给他们的实现类去完成。
例1:打印出来源的信息
不遵守依赖倒转原则的写法
public class RawDependenceReversal { public static void main(String[] args) { Person p = new Person(); p.receive(new Email()); }}class Email{ public String getInfo(){ return "电子邮件信息"; }}class Person{ public void receive(Email e){ System.out.println(e.getInfo()); }}
此时,若Person
类可以接收的来源不只是Email,还需要添加其他来源时,会比较麻烦。
遵守依赖倒转原则进行改进:
public class ImproveDependenceReversal { public static void main(String[] args) { Persons p = new Persons(); p.receive(new Emails()); p.receive(new WeChat()); }}interface Sender{ public String getInfo();}class Emails implements Sender{ @Override public String getInfo(){ return "电子邮件信息"; }}class WeChat implements Sender{ @Override public String getInfo() { return "微信信息"; }}class Persons{ public void receive(Sender e){ System.out.println(e.getInfo()); }}
依赖倒转的使用方式示例\
方式1:使用接口方式来进行依赖(调用方法时使用接口作为参数)。此时,依赖的是接口而不是细节类,因此符合依赖倒转原则
interface IOpenAndClose{ void open(ITV tv);}class OpenAndClose implements IOpenAndClose{ @Override public void open(ITV tv) { tv.play(); }}interface ITV{ void play();}
方式2:通过构造方法来进行依赖
interface IOpenAndClose{ void open();}interface ITV{ void play();}class OpenAndClose implements IOpenAndClose{ public ITV tv; public OpenAndClose(ITV tv){ this.tv = tv; } @Override public void open() { this.tv.play(); }}
方式3:通过setter方法来进行依赖
interface IOpenAndClose{ void open(); public void setTv(ITV tv);}interface ITV{ void play();}class OpenAndClose implements IOpenAndClose{ private ITV tv; @Override public void open() { this.tv.play(); } @Override public void setTv(ITV tv) { this.tv = tv; }}
注意事项和细节
- 低层模块尽量都要有其对应的高层抽象类或接口,稳定性更好
- 变量的声明尽量是抽象类或接口,使变量和实际对象之间添加一层缓冲,利于扩展和优化
- 继承时遵循里氏替换原则
四、里氏替换原则
- 所有引用基类的地方必须能够透明的使用其子类的对象。
- 使用继承时,子类尽量不重写父类方法。
- 继承实际上提升了类的耦合性。在适当的情况下,可以使用聚合、组合、依赖来解决问题
五、开闭原则
- 模块和方法应该对扩展(提供方)开放,对修改(使用方)关闭。用抽象构建框架,用实现扩展细节
- 软件需要变化时,尽量通过扩展实体的方式来实现变化,而不是通过修改现有的代码来实现庇阿变化
- 其他原则及使用设计模式的目的是遵守开闭原则
六、迪米特法则
- 一个对象应该对其他对象保持最小的了解。
- 迪米特法则又称为最小知道原则。一个类对于其依赖的类,不管它多么复杂,都只关心其提供的
public
方法。 - 迪米特法则就是只与直接的朋友通信
- 直接的朋友:出现在成员变量、方法参数、方法返回值的类称为直接的朋友,出现在局部变量(方法内部的变量)的类不是直接的朋友。
七、合成复用原则
- 尽量使用合成/聚合的关系,而不是使用继承
设计模式分类
23种分为三大类
创建型模式
单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式
模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式
原文转载:http://www.shaoqun.com/a/505921.html
reverb:https://www.ikjzd.com/w/1273
promotion:https://www.ikjzd.com/w/127
设计模式的目的使程序拥有更好的的代码复用性(一次编译,处处运行[手动狗头])可读性(不可替代性堪忧呀)可扩展性(新增功能时方便)可靠性(新增功能后对旧功能没有影响)高内聚,低耦合设计模式的七大原则设计模式的原则:设计"设计模式"时,遵守的原则,这样设计的依据〇、设计模式核心思想找出应用中可能需要变化之处,将其独立出来,不要和固定不变的代码混在一起针对接口编程,而不是针对实现接口编程为了交互对象之间
reverb:reverb
拍拍购物:拍拍购物
广州比较大的步行街在哪呀?:广州比较大的步行街在哪呀?
黄花岗在哪里?广州黄花岗属于哪个区:黄花岗在哪里?广州黄花岗属于哪个区
2020年搞笑元旦晚会开场白:2020年搞笑元旦晚会开场白
没有评论:
发表评论