设计模式
2020-08-28 13:57:13 0 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
代理模式
简单理解
当前对象不愿意干的,没法干的东西委托给别的对象来做,我只要做好本分的东西就好了
透明代理
在代理中内部直接new出被代理对象。此时使用代理对象对外界来说是透明的
动态代理
使用JDK的API实现动态代理
代理对象拥有目标对象相同的方法【因为参数二指定了对象的接口,代理对象会实现接口的所有方法】
用户调用代理对象的什么方法,都是在调用处理器的invoke方法。【被拦截】
使用JDK动态代理必须要有接口【参数二需要接口】
所有通过动态代理实现的方法全部通过invoke()调用
使用CGLib实现动态代理
如果没有接口的情况下,这种形式可以通过类来实现动态代理,生成的是子类代理
动态代理和静态代理的区别
静态代理需要自己写代理类-->代理类需要实现与目标对象相同的接口
需要自己实现接口下的所有方法
代理对象的生成,是利用JDKAPI,动态地在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型),并且会默认实现接口的全部方法。
应用
增强request对象实现中文过滤器
单例模式
简单理解
频繁创建对象、管理对象是一件耗费资源的事,如果我们可以使用一个对象就可以完成功能了,那就使用单例模式吧!
静态.doSomething和单例的区别
使用静态类.doSomething()体现的是基于对象
使用单例设计模式体现的是面向对象。
编写单例模式步骤
构造函数私有化
在类的内部创建实例
提供方法获取该实例
单例模式五种写法
饿汉式
直接在成员变量上new出实例,提供方法返回
普通懒汉式
等到调用方法的时候再创建对象,该方法需要加Synchronized锁
双重检测机制(DCL)懒汉式
基于普通懒汉式的提升,普通懒汉式的效率太低了
1.使用volatile修饰我们的对象引用
2.外部if判断对象是否为null,为null往下执行,不为null直接返回对象
3.使用syn同步进入代码块,使用if判断对象是否为null,为null就创建对象
4.使用volatile修饰成员变量的原因就是防止重排序的问题--->变量还未完全初始化就被线程B返回了
静态内部类懒汉式
创建一个内部类,在内部类直接创建对象
外部类提供方法来获取内部类创建的对象
这种方式是非常方便和友好的,在外部调用的时候,内部类才会创建对象
枚举
public enum Java3y3y {
JAVA_3_Y_3_Y,
}
省事,安全(枚举能够有效防止多次实例化的问题)
门面模式
简单理解
门面模式提供一个高层次的接口,使得子系统更易于使用
子系统就相当于电脑、冰箱、电视。统一的对象就相当于我们的电闸
门面模式要素
一个高层次的接口
多个实现类
包装模式
简单理解
增强对象有三种方式
继承
包装模式
代理模式
前提:继承的方式不容易扩展(写死),如果类中带有信息也是不能用继承的方式的
于是我们就有包装设计模式给我们很方便的扩展
包装模式使用
前提:拥有一个接口,一个默认实现类
动工:编写一个装饰器(抽象类)->实现接口->以组合的方式来接收默认实现类
使用:要扩展的时候,就继承上面编写的装饰器,定义自己想要扩展的功能
说白了就多了一层抽象,基于这层抽象来方便扩展
应用
IO流用得就很多了:BufferedReader bf = new BufferedReader(new FileReader(new File("aa.txt")));
工厂模式
简单理解
工厂模式就是让创建对象变得简单而且修改对象时能很方便
另一个方便就是体现在解耦
工厂模式延伸了三类
简单工厂模式
工厂方法模式
抽象工厂模式
工厂方法模式编写
1. 一个抽象工厂类
2. 多个实现工厂类
3. 外部通过工厂拿到对象
优缺点
优点
1:客户端不需要在负责对象的创建,明确了各个类的职责
2:如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可
3:不会影响已有的代码,后期维护容易,增强系统的扩展性
缺点
需要额外的编写代码,增加了工作量
简单工厂模式编写
1. 就一个实现工厂类,所有的对象交由该工厂类创建
2. 外部通过这个工厂类获取对象
优缺点
优点
就一个具体的工厂来创建对象,代码量少。
缺点
增加了对象就需要修改代码,麻烦
抽象工厂模式
在工厂方法模式下又多了一层抽象,减少了工厂的数量
衍生出了产品族和产品等级(无非就是将公有的功能抽象出来了)
优缺点
优点
减少了工厂的数据
缺点
难以扩展产品族,会修改非常多的类
策略模式
简单理解
将每个算法都封装起来,并且使他们之间可以互换
上下文角色(Context)只是为了简化客户端调用,解耦
策略模式要素
一个通用算法接口
多个实现类
一个上下文角色(Context)
0 条评论
下一页