设计模式
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返回了
静态内部类懒汉式
创建一个内部类,在内部类直接创建对象
外部类提供方法来获取内部类创建的对象
这种方式是非常方便和友好的,在外部调用的时候,内部类才会创建对象
枚举
省事,安全(枚举能够有效防止多次实例化的问题)
门面模式
门面模式提供一个高层次的接口,使得子系统更易于使用
子系统就相当于电脑、冰箱、电视。统一的对象就相当于我们的电闸
门面模式要素
一个高层次的接口
多个实现类
包装模式
增强对象有三种方式
继承
前提:继承的方式不容易扩展(写死),如果类中带有信息也是不能用继承的方式的
于是我们就有包装设计模式给我们很方便的扩展
包装模式使用
前提:拥有一个接口,一个默认实现类
动工:编写一个装饰器(抽象类)->实现接口->以组合的方式来接收默认实现类
使用:要扩展的时候,就继承上面编写的装饰器,定义自己想要扩展的功能
说白了就多了一层抽象,基于这层抽象来方便扩展
IO流用得就很多了:BufferedReader bf = new BufferedReader(new FileReader(new File(\"aa.txt\")));
工厂模式
工厂模式就是让创建对象变得简单而且修改对象时能很方便
另一个方便就是体现在解耦
工厂模式延伸了三类
简单工厂模式
工厂方法模式
抽象工厂模式
工厂方法模式编写
1. 一个抽象工厂类
2. 多个实现工厂类
3. 外部通过工厂拿到对象
优缺点
优点
缺点
简单工厂模式编写
1. 就一个实现工厂类,所有的对象交由该工厂类创建
2. 外部通过这个工厂类获取对象
就一个具体的工厂来创建对象,代码量少。
增加了对象就需要修改代码,麻烦
在工厂方法模式下又多了一层抽象,减少了工厂的数量
衍生出了产品族和产品等级(无非就是将公有的功能抽象出来了)
减少了工厂的数据
难以扩展产品族,会修改非常多的类
策略模式
将每个算法都封装起来,并且使他们之间可以互换
上下文角色(Context)只是为了简化客户端调用,解耦
策略模式要素
一个通用算法接口
一个上下文角色(Context)
0 条评论
回复 删除
下一页