设计模式的六大原则
(1)单一职责原则:一个类应该只负责一项职责,降低类的复杂度。
(2)接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上。
(3)依赖倒转原则:中心思想是面向接口编程
(4)里氏替换原则:在子类中尽量不要重写父类的方法,而且继承实际上是使两个类的耦合性更强了。
(5)开闭原则:对扩展开放(针对提供方)、对修改关闭(针对使用方)
(6)迪米特法则:也称为最少知道原则,即一个类对自己依赖的类知道的越少越好。
设计模式是某类问题的通用解决方案,目的是提高软件的维护性、通用性和扩展性,并降低软件的复杂度
设计模式分为三种类型,共23种
1、创建型模式(5种)
1.1单例模式:在容器内只存在一个实例对象(私有的构造函数,对外提供公共获取对象实例的静态方法),实现方式饿汉式和懒汉式;;Runtime则使用该模式
1.2工厂模式、抽象工厂模式、简单工厂模式:是工厂模式的一种,是由一个工厂对象决定创建出哪一种产品的实例;定义一个创建对象的类,由这个类来封装实例化对象的过程
1.3原型模式:用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象。应用:spring中当bean的作用域指定为prototype时使用的即为原型模式
浅拷贝:对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递也就是将其复制一份给到新的对象;对于引用数据类型的成员变量,浅拷贝将进行引用传递,既新老对象
共同指向同一个内存地址,这样造成的结果就是当其中一个引用对象中的变量改变时另一个也会受到影响。。实现方式通过clone方法克隆的对象。
深拷贝:复制对象的所有基本数据类型的成员变量,同时为所有引用类型的成员变量申请存储空间,并复制每个引用数据类型的成员变量所引用的对象。即对整个对象进行拷贝;
实现方式:一是重写clone方法并对于引用类型的成员变量单独处理的方式实现二是通过对象序列化实现(推荐)。
1.4建造者模式:核心思想(将产品和产品建造过程解耦),一步一步创建一个复杂的对象,允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道内部的具体构建细节。。角色(产品-具体的产品对象、抽象建造者-创建产品各个部件的接口/抽象类、具体建造者-实现接口构建和装配各个部件、指挥者-创建复杂的对象,主要作用是隔离客户与产品的生产过程且负责控制产品对象的生产过程),StringBuild则为建造者模式
2、结构型模式(7种)
2.1适配器模式:将某个类的接口转换成客户端期望的另一个接口,主要目的是兼容性。让原本不兼容的类可以兼容
类适配器模式:创建Adapter类,继承src类(源)实现dst类(目标)接口,在适配类Adapter中完成dst->src的适配
对象适配器模式:实现与类适配器大致相同,只是将Adapter类做修改,不是继承src类而是持有src类的实例即持有src类实例实现dst接口完成src->dst的适配
接口适配器模式:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法)这样该抽象类的子类可有选择地覆盖父类的某些
方法来实现需求(springmvc中的handlerAdapter使用适配器模式)
2.2桥接模式:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。通过使用封装、聚合及继承等行为让不同的类承担不同的职责。(driver驱动类使用该模式)
2.3装饰模式:动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性。(java中io流的InputStream中的FileInputStream)
2.4组合模式(部分整体模式):它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系,同时组合能让客户以一致的方式处理个别对象以及组合对象。
HashMap使用到了组合模式
2.5外观模式(过程模式):为子系统中的一组接口提供一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部实现。
2.6享(共享)元(对象)模式(蝇量模式):运用共享技术有效地支持大量细粒度的对象(即对象共享)。常用于系统底层开发,解决系统的性能问题,经典应用场景为池技术:String常量池、数据库连接池、缓冲池等等,可以解决重复对象的内存浪费问题。
2.7代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。优点是可以在目标对象实现的基础上,增强额外的功能操作。
静态代理:在使用时需要定一个接口或者父类,被代理对象和代理对象一起实现相同的接口或者继承相同父类。
动态代理(JDK代理或接口代理):代理对象不需要实现接口,但目标对象要实现接口。否则不能使用动态代理
CGLIB代理(子类代理):它是在内存中构建一个子类对象从而实现对目标对象功能扩展。优势:目标对象不需要实现接口
3、行为型模式(11种)
3.1模版方法模式:定义一个操作中的骨架,将一些步骤延迟到子类中,使得子类可以不改变结构的情况下就可以重定义某些待定步骤。
3.2命令模式:使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦;;如万能遥控器,可控制电灯、电视、空调等等家用电器
3.3访问者模式:封装一些作用于某种数据结构的各元素的操作,可以在不改变数据结构的前提下定义用于这些元素的新的操作即将数据结构与数据操作分离,解决数据结构和操作耦合性问题。
3.4迭代器模式:提供一种遍历集合元素的统一接口,用一致的方式遍历集合元素,不需要知道集合对象的底层结构(可以使数组、集合或者其他结构)即不暴露其内部的结构
3.5观察者模式:对象之间存在多对一依赖的一种设计方案。被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化(如接收气象局推送天气情况的各个三方网站)
3.6中介者模式:使用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
3.7备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保持这个状态。这样以后就可以将该对象恢复到原先保存的状态。
3.8解释器模式:是指给定一个语言(即表达式)定义他的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式),常用于运算表达式、正则表达式等
3.9状态模式:主要用来解决对象在多种状态转换时需要对外输出不同行为的问题。状态和行为是一一对应的,状态之间可以相互转换。
3.10策略模式:定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。核心思想有三个:一将变化的代码从不变的代码中分离出来;二针对接口编程而不是具体类;三多用组合/聚合少使用继承
3.11责任链模式:对于请求存在多个处理者,每个处理者都会包含下一个处理者的引用,从而形成链的形式,请求会沿着链进行传递,直到有处理者处理请求为止;同时也可以让所有处理者都对请求进行处理,形成闭环(如查询多个系统的数据组装成一个对象用于前端展示就可使用闭环的形式)