博客
关于我
23种设计模式 GoF23
阅读量:307 次
发布时间:2019-03-04

本文共 2620 字,大约阅读时间需要 8 分钟。

23种设计模式 GoF23

提高思维能力、编程能力、设计能力

程序设计更加标准化、工程化,开发效率大大提高

可读性高,可靠性强、可维护性强

一种思维、一种态度、一种进步

要理解思想

设计模式的基本要素

模式名称

问题

解决方案

效果 (优点和缺点)

哪23种?

创建型模式

单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式

结构型模式

适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

行为型模式

模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

OOP的七大原则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GiKxuCq4-1615135648142)(C:\Users\ThundeRobot\AppData\Roaming\Typora\typora-user-images\image-20210307181638349.png)]

工厂模式

详细分类

简单工厂模式

工厂方法模式

抽象工厂模式

OOP七大原则

开闭原则:一个软件的实体应当对扩展开发,对修改关闭

依赖倒转原则:要针对接口编程,不要针对实现编程

迪米特法则:只与你直接的朋友通信,而避免和陌生人通信

核心本质

实例化对象不适用new,用工厂方法代替

将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sbiWQqCd-1615135648144)(C:\Users\ThundeRobot\AppData\Roaming\Typora\typora-user-images\image-20210307183421443.png)]

建造者模式

代理模式 proxy

为什么要学习代理模式? 因为这是SpringAOP的底层 【SpringAOP和SpringMVC】

静态代理

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来解决 共同完成的事情
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作
  • 客户:访问代理对象的人

代理角色的好处:

  • 让真实角色的操作更加的纯粹!不用去关注一些公共的业务
  • 公共业务就交给代理角色!实现了业务的分工
  • 公共业务发生扩展时,方便集中管理!

缺点

  • 一个真实角色,就会产生一个代理角色,开发效率会变低~

加深理解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AwJKj0cn-1615135648145)(C:\Users\ThundeRobot\AppData\Roaming\Typora\typora-user-images\image-20210307202427854.png)]

动态代理

  • 动态代理角色和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是我们直接写好的!
  • 动态代理分为两大类: 基于接口的动态代理 、 基于类的动态代理
    • 基于接口 ---- JDK动态代理【我们使用】
    • 基于类: cglib
    • java字节码实现: javassist 比较流行,但是不是tomcat

需要了解两个类

Proxy(代理)

有一个静态方法,可以创建一个实例的动态代理

java.lang.reflect.InvocationHandler(调用处理程序)

通过代理实例 调用处理程序的一个接口

// 可以当作一个工具类package com.realguo.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler {       private Object target;    // 设置被代理的接口    public void setTarget(Object target) {           this.target = target;    }    // 生成代理类 对象实例    public Object getProxy(){           return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);    }    // 处理代理实例,并返回结果    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {           // 动态代理的本质,通过使用反射机制实现!!!        log(method.getName());        Object result = method.invoke(target, args);        return result;    }    void log(String name){           System.out.println("[" + name + "]");    }}

理解

Proxy.newProxyInstance(类加载器,要实现的代理接口,InvocationHandler调用处理程序)

返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

InvocationHandler 是 代理实例的调用处理程序 实现 的接口 ,里面有调用处理程序

动态代理的本质:

是通过反射来实现的

动态代理的好处:

  • 让真实角色的操作更加的纯粹!不用去关注一些公共的业务
  • 公共业务就交给代理角色!实现了业务的分工
  • 公共业务发生扩展时,方便集中管理!
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类,可以代理多个类,只要实现了同一个接口即可

单例模式

饿汉模式

懒汉模式

双重锁

转载地址:http://dvsq.baihongyu.com/

你可能感兴趣的文章
BootstrapValidator手动触发部分验证
查看>>
vue调试工具vue-devtools安装及使用
查看>>
CSS总结div中的内容垂直居中的四种方法
查看>>
[BZOJ4878]挑战NP-Hard
查看>>
vue指令之v-for
查看>>
[CF1278F]Cards
查看>>
jQuery实现无刷新切换主题皮肤功能
查看>>
[CF932E]Team Work
查看>>
用postman测试url参数
查看>>
Random IS
查看>>
Vue的is属性
查看>>
Vue爬坑之v-model和v-bind(二)
查看>>
神犇和蒟蒻
查看>>
vue组件传参 props default 数组/对象的默认值应当由一个工厂函数返回
查看>>
vue爬坑之 父组件向子组件异步传参 子组件中拿不到值的解决方法
查看>>
js基础复习5-原型链与js的成员查找机制
查看>>
js基础复习8-call方法简单使用以及javascript继承
查看>>
【游记】被吊打DAY2
查看>>
微信公众号开发之素材管理
查看>>
mysql limit 1 (报错信息:Subquery returns more than 1 row)
查看>>