设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
二、四人帮GOF(全拼 Gang of Four)在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
对接口编程而不是对实现编程。
优先使用对象组合而不是继承。
三、设计模式 模式包括创建型模式
工厂模式(Factory Pattern)
单例模式(Singleton Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
结构型模式
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
我觉得23种是对设计模式一图中里面的组成23种,那就是把这两种抽离出来了:空对象模式(Null Object Pattern) 过滤器模式(Filter、Criteria Pattern)。
有人会说了那么多的设计模式该如何去记呢?找对方法很重要。首先把设计模式稍加熟练再加上我下面这串,我相信一定会很快记住的。当然如果有更好的方法就采用更好的方法。
工单抽建原、适桥组装外享代、责命解迭中备观壮策模访。分别对应创、结、行。
四、设计模式理解创建型模式(创建对象的模式、抽象实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑)
(1)工厂模式:
简单工厂:面向原型接口,通过对原型接口的实现,构造出多个对应的方法
抽象工厂:面向原型接口,依据传入参数,调用不同的实现类的实现方法,
静态工厂:在工厂类上使用static ,使得调用时无需new 工厂类(2)单例模式:
懒汉式:使用时再创建对象(什么时候实在快饿死了就去吃)
饿汉式:一开始创建,使用时再调用(一开始就去吃)
双重校验双重锁:多线程单例模式,采用主要采用双重校验和双重锁实现
静态内部类:java特性:程序运行时类加载器对每个类只加载一次到jvm,在静态类中率先new对象(3)建造者模式;
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示
1.使用接口,面向接口,不同的角色实现不同的接口:建造者,建造清单,单品
2.使用单个类(4)原型模式:
是用于创建重复的对象,同时又能保证性能。
浅克隆: java 提供了对浅克隆的支持:实现cloneable接口,重写clone(),方法中只需调用父类的 clone();
浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象
深克隆:实现cloneable接口和Serializable接口,重写clone(),方法中需要编写获取原对象的序列化字节码,再通过该字节码还原成深度克隆对象
结构型模式(作用于类于类之间的组合拓展)
(1)适配器模式:
是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
(2)桥接模式:
是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦
(3)组合模式:
自己本身持有自己的对象,具有层级关系的结构都可以使用该种设计模式
(4)装饰者模式:
允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。(5)外观模式:隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。通常情况下将该类设置为静态
(6)享元模式:
主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
(7)代理模式:(静态代理:知晓代理者是谁;动态代理:不知晓代理者是谁,运行时才知晓)
动态代理:
jdk动态代理(代理类实现了InvocationHandler 接口),同时实现 invoke() 方法(拦截器),方法内部通过 参数 Method 的对象调用的 invoke(被代理类对象(通过构造函数对被代理类对象进行赋值), 第三参数)的方法前后来进行增强, 同时书写一个 createproxy()方法,内部使用反射机制提供的Proxy.newintance(被代理者的类加载器,被代理者所实现的接口,拦截器);
cglib:
导入cglib依赖,创建代理类,实现 MethodInterceptor 接口,同样的也需要保存被代理类的对象,接着我们依旧创建一个方法createproxy(),不过此时的方法作用是用来对字节码进行修改,使用Enhancer 类(字节码增强器)
首先.setCallback(this);设置回调,.setSuperclass(被代理类.getClass());将被代理类作为父类,接着返回使用字节码创建的子类。接着在拦截器(intercept)方法中,第四参数.invoke(第一参数, 第三参数);在其前后可以对方法进行增强。
行为型模式 (行为型模式是对在不同的对象之间划分责任和算法的抽象化,行为型模式不仅仅关注类和对象的结构,而且重点关注他们之间的相互作用,通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。)
(1)责任链模式
为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。角色包含:抽象处理类(包含抽象处理方法和请求转让);实体处理类(实现对具体请求的处理);客户(只管将请求提交给责任链头)
(2)命令模式
是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。(角色:执行者,具体的命令实体,命令传递者)
(3)解释器模式
提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 角色:元数据,解释器,结果.
(4)迭代器模式
是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
包含三个角色
迭代器使用接口;包含获取迭代器的方法;
迭代器接口;包含hasNext(),next();
迭代器获取类(使用类);包含一个实现了迭代器接口的内部类(5)中介者模式
是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式
两个角色
中介者类:包含与单个类交互的方法
对象类:与中介者交互,然后中介者与另一对象类交互,最终达到对象与对象之间的交互。(6)备忘录模式
保存一个对象的某个状态,以便在适当的时候恢复对象。
(7)观察者模式
比如,当一个对象被修改时,则会自动通知依赖它的对象。
(8)状态模式
类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
角色:
抽象对象状态类:内部一般包含一个对象状态设置方法;
状态具体实现类:实现了第一个角色中的方法;
具体对象类:以该类的状态为主要作用的对象类,内部包含了状态属性(9)策略模式
一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
------------------------------------------------------
策略模式:通过改变策略对象从而达到不同的作用与效果
角色
抽象策略对象/接口:包含抽象的策略方法
实体策略对象:对上者的具体实现,不同的策略对象用于不同的实际场景
对象实体类:包含了调用策略对象方法的方法;(10)模板模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
-------------------------------------------------
模板模式:以抽象类的形式设计一个模板,可以用类去继承该抽象类,从而达到实现模板的效果,不同的模板有不同的实现方式角色
抽象类模板:内部定义了一些模板方法;
模板实现类;内部实现了模板抽象类的方法;(11)访问者模式
我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作