面向对象编程原则和几种常用设计模式
设计模式相关项目举例链接地址
7大设计原则
-
单一职责原则
- 降低类的复杂度,一个类只负责一项职责
- 提高可读性可维护性
-
接口隔离原则
一个类对另一个类的依赖应该建立在最小的接口上
-
依赖倒转原则
- 低层模块尽量都要有抽象类或接口
- 变量的声明类型尽量是抽象类或接口,以在变量引用和实际对象间存在一个缓冲层
- 继承时遵循里氏替换原则
-
里氏替换原则
- 所有引用基类的地方必须能透明地使用其子类的对象
- 在子类中尽量不要重写父类的方法
-
开闭原则
- 对扩展开放,对修改关闭。
-
迪米特法则
- 简单定义:只与直接的朋友通信,最少知道原则。
- 核心是降低类之间的耦合
-
合成复用原则
- 尽量使用合成/聚合的方式,而不是使用继承。
- 针对接口编程
类图
- 依赖关系:
- 泛化关系:继承
- 实现关系:
- 关联关系:
- 聚合关系:
- 组合关系:整体和部分不可分开
设计模式
单例模式
- 保证了 系统内存中该类只存在一个对象,节省了系统资源。
- 对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
- 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
使用场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
工厂模式
三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。
变量不要直接持有具体类的引用。 不要让类继承具体类,而是继承抽象类或者是实现interface(接口) 不要覆盖基类中已经实现的方法。
- 简单工厂,就是一个工厂里面可以加工一个类型的不同实例对象,比如可以加工好座椅,也可以加工坏座椅,但必须是座椅。
- 工厂方法的一个工厂只能加工一个类型的一个实例对象。比如,座椅,一个工厂只能加工一种质量的座椅出来。
- 抽象工厂比较适合一个产品簇。因为一个工厂可以加工多个不同类型的实例对象。比如【座椅,轮胎】,一个工厂不但可以加工出来座椅,还可以加工出来轮胎,但是座椅,和轮胎的种类只能是一种。
原型模式
- 创建新的对象比较复杂时,用来简化对象的创建过程,同时也能够提高效率
- 不用重新初始化对象,而是动态地获得对象运行时的状态
- 如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化,无需修改代码
- 在实现深克隆的时候可能需要比较复杂的代码
- 缺点:需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改其源代码,违背了ocp原则。
适配器模式
三种命名方式,是根据 src是以怎样的形式给到Adapter(在Adapter里的形式)来命名的。将原本不兼容的接口融合在一起工作。
-
类适配器:以类给到,在Adapter里,就是将src当做类,继承
- Java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点, 因为这要求dst必须是接口,有一定局限性;
- src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
- 由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。
-
对象适配器:以对象给到,在Adapter里,将src作为一个对象持有。
- 根据合成复用原则,使用组合替代继承。
- 解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口 使用成本更低,更灵活。
-
接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
- 一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。
- 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
- 适用于一个接口不想使用其所有的方法的情况。
代理模式
- 通过代理对象访问目标对象。好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
- 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
- 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK代理、接口代理)和 Cglib代理(可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴)。
观察者模式
- 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知。
- 这样,我们增加观察者(这里可以理解成一个新的公告板),就不需要去修改核心类WeatherData不会修改代码,遵守了ocp原则。