设计模式
文章平均质量分 80
Ch.yang
try{ coding } catch { bug }
展开
-
【源码】hamcrest 源码阅读 泛型 extends 和迭代器模式
官方文档上篇文章Hamcrest 源码阅读及空对象模式、模板方法模式的应用本篇文章迭代器模式hamcrest 作为一个matcher库,把某个matcher的职责打印出来,可以方便开发者进行调试。原创 2023-10-07 11:30:23 · 296 阅读 · 0 评论 -
【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用
hamcrest ,一个被多个测试框架依赖的包。听说 hamcrest 的源码质量很高,特此来学习一下。建议fork原仓库,拉到本地看代码。代码仓库hamcrest github 仓库。原创 2023-10-02 13:58:46 · 1217 阅读 · 0 评论 -
【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性
思考用 AOP 把校验代码实践用 Spring MVC 的 RequestBodyAdvice 做AOP逻辑继承 RequestBodyAdviceAdapter 实现自己的 适配器用自己的适配器让代码可读性增加熟悉 Spring MVC 、Java 反射的一些实践本文内容澄清一个AOP校验JSON内容的思路复习适配器模式。原创 2023-06-19 23:06:03 · 1936 阅读 · 0 评论 -
【著作阅读笔记】《代码整洁之道》对Sql类的重构引发的思考
代码整洁之道》第十章,类。教我们去识别能支持拓展的代码是怎样的,跟设计模式是有交集的,包括单一原则,开闭原则。借书中的代码和阐述,记录下对原则的认识,及识别高内聚、可拓展的代码。...原创 2022-08-07 16:38:02 · 170 阅读 · 0 评论 -
【Spring】著作阅读笔记——IOC思想及工厂模式
前言琢磨了一段时间整合Spring Security ,及Spring Security的使用,处于能搭出来却毫无安全感的情况。归根到底还是对spring 框架的核心思想缺乏体系化的理解。在豆瓣书籍中找到了评分高达9.1的《spring揭秘》,这本书09年出版,现已绝版,用到的spring 版本最多仅到2.5,虽然时间久远,但是Spring Security彼时已经在spring大家族中。如果用发展的眼光理解框架,我认为无论是spring boot的自动装配还是spring cloud的整合,了解spri原创 2022-02-03 16:47:53 · 891 阅读 · 0 评论 -
【Spring】著作阅读笔记——事务传播行为
前言前段时间整理了数据库事务相关的内容,事务传播行为就是程序对事务的编排。事务传播行为在工作上的使用很重要,曾经在线上环境因为开启了大事务并嵌套小事务造成了死锁问题,现借《Spring 揭秘》整理以下具体知识和使用场景。声明式事务已经非常流行了,在声明的注解上即可指定传播行为。1. 事务为什么会传播?1.1 DAO模式DAO模式的出现,从官网摘了几句话,希望能概括DAO模式具体提供了什么思路:The DAO implements the access mechanism required to原创 2022-02-15 21:23:12 · 372 阅读 · 0 评论 -
【源码】Spring Security 官方文档阅读并查源码解读认证流程
官网及用词说明官网:Spring Security Reference Version 5.2.15.RELEASE用词:开发者 - 项目中的程序员系统用户 - 项目中数据库表中较为复杂的用户框架用户 - Spring Security 框架中中定义的用户1. 获取认证过的用户主体1.1 借 SecurityContextHolder 从线程中获得与程序交互的主体信息 Authentication该类内部组合了一个SecurityContextHolderStrategy 也是就存储上原创 2022-01-22 18:30:24 · 1502 阅读 · 1 评论 -
【Java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想
JDK源码的类定义public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializablepublic class LinkedHashMap<K,V> extends HashMap<K,V> implements...原创 2020-03-08 14:06:26 · 1152 阅读 · 3 评论 -
【java_设计模式】动态代理和静态代理的本质区别
前言网上有很多讲动态代理和静态代理的写法作为区分原因,但是都没有讲到本质上本文主要从应用层自上而下看待这个问题应用场景静态代理 // 数据准备 Order order = new Order();order.setUserId(1); Money money = new Money(); // 创建静态代理 O...原创 2019-10-25 20:22:53 · 890 阅读 · 0 评论 -
【java_设计模式】中介者模式
学习路径: https://coding.imooc.com/class/270.html应用场景如学习小组的业务场景,聊天室就是一个中介者, public static void main(String[] args) { Student tom = new Student("Tom"); Student jerry = new Student("Jer...原创 2019-06-08 14:04:08 · 106 阅读 · 0 评论 -
【java_设计模式】责任链模式
学习路径: https://coding.imooc.com/class/270.html应用场景流程的审批 public static void main(String[] args) { SuperiorHandler superiorHandler = new SuperiorHandler(); DepartmentHandler departme...原创 2019-06-08 21:20:27 · 145 阅读 · 0 评论 -
【java_设计模式】模板模式
https://coding.imooc.com/class/270.html应用场景提供自定义服务给应用层,但是可复用的方法自己封装起来。可复用的方法如果有属性是按需提供的,可以使用钩子方法控制。相关设计模式建造者模式是链式配置对象,把配置过程暴露在应用层。而模板模式,是把自定义的代码块封装在类里。同样是保留默认配置,提供外部自定义修改的方法,形式不同。个人认为两者可以一起用。建造者...原创 2019-06-03 12:30:35 · 111 阅读 · 0 评论 -
【java_设计模式】迭代器模式
https://coding.imooc.com/class/270.html前言迭代器模式一般不会自己维护代码,以用和读代码为主,以下自己实现集合类与迭代器类增强理解过程。应用场景public static void main(String[] args) { // 待装载的数据 Course course = new Course("course")...原创 2019-06-04 17:59:36 · 101 阅读 · 0 评论 -
【java_设计模式】访问者模式
前言“访问者模式一般开发中比较少用,但是如果需要用到了,该模式将是最佳实现”应用场景网课有免费课程、实战课程(付费)。访问课程的角色有学生、老师。存在以下四种行为:老师访问免费课程、老师访问付费课程、学生访问免费课程、学生访问付费课程。代码上如果要拓展这种行为,可以考虑采用访问者模式 public static void main(String[] args) { ...原创 2019-06-11 14:37:07 · 127 阅读 · 0 评论 -
【java_设计模式】状态模式
学习路径: https://coding.imooc.com/class/270.html前言 状态模式适用于不同的状态解耦,同时可以定义不同状态的行为、不同状态转换中的行为。应用场景/** * 测试视频的开始、暂停、停止状态 * 首次初始化上下文后,视频为开始状态 * @param args */ public static v...原创 2019-06-12 12:28:26 · 177 阅读 · 0 评论 -
【java_设计模式】建造者模式为什么要使用静态内部类
Debug 动机为什么建造者模式的Builder需要设置为静态内部类,普通内部类为什么不行?建造者模式代码(Builder设置为普通内部类)/** * 使用p普通内部类 创建Builder * @param args */public static void main(String[] args) { Course.CourseBuilder courseBuild...原创 2019-08-23 15:44:09 · 952 阅读 · 4 评论 -
【java_设计模式】装饰者模式
应用场景煎饼加香肠和加蛋 – 使用单一继承 public static void main(String[] args) { // 需要一个普通的煎饼 Battercake b1 = new BattercakeWithEgg(); // 需要一个加蛋的煎饼 BattercakeWithEgg b2 =...原创 2019-09-10 18:48:35 · 125 阅读 · 0 评论 -
【java_设计模式】jdk动态代理原码解析,debug 获取 $proxy0
普通测试场景业务场景保存订单信息分层模型IOrderService -> OrderServiceImpl业务代码public class OrderServiceImpl implements IOrderService { // spring 会自己注入,这里手动注入 private IOrderDao iOrderDao; @Override ...原创 2019-10-09 23:39:14 · 362 阅读 · 0 评论 -
【java_设计模式】命令模式
学习路径: https://coding.imooc.com/class/270.html应用场景 public static void main(String[] args) { Course course = new Course("高数课"); // 开课命令的实例 OpenCourseVideoCommand openCourseV...原创 2019-06-08 13:14:18 · 89 阅读 · 0 评论 -
【java_设计模式】代理模式 jdk动态代理 三种业务实现
学习路径:https://coding.imooc.com/learn/list/270.html前言Spring 的AOP实质就是动态代理模式应用场景,静态代理的演进静态代理静态代理模式下的被代理类没有使用多态。动态代理借助JDK的InvocationHandler接口实现多态,从而完成动态绑定实例化的类型实现实现InvacationHandler改写invoke方...原创 2019-06-02 16:46:39 · 378 阅读 · 0 评论 -
【java_设计模式】备忘录模式
学习路径: https://coding.imooc.com/class/270.html前言备忘录模式更像是一种业务实现。应用场景文本内容的撤销、博客编辑内容时找回上一步存档public static void main(String[] args) { // 新建文章 Article article = new Article("A标题", "A内...原创 2019-06-07 23:35:05 · 105 阅读 · 0 评论 -
【java_设计模式】简单工厂、工厂方法、抽象工厂
学习路径:https://coding.imooc.com/class/270.html【简单工厂】不属于设计模式,是一种【编码风格】【工厂方法】、【抽象工厂】属于【创建型】的设计模式// 基础简单工厂FruitFactory fruitFactory = new FruitFactory();// 约定一个标识让工厂去生成,这里可以用反射的方式演进得更合理Fruit fruit ...原创 2019-05-19 19:07:26 · 378 阅读 · 0 评论 -
【java_设计模式】建造者模式
学习路径:https://coding.imooc.com/learn/list/270.html应用场景:对生成对象进行链式配置 public static void init() { if (okHttpClient == null) { OkHttpClient.Builder builder = new OkHttpClient.Builde...原创 2019-05-21 17:40:53 · 2170 阅读 · 2 评论 -
【java_设计模式】原型模式、浅拷贝和深拷贝
学习路径:https://coding.imooc.com/class/270.html应用场景需要同一个类的多个不同对象完成业务操作,群发email,需要多个Mail类的对象好处:提高性能 public static void main(String[] args) throws CloneNotSupportedException { Mail mail = new...原创 2019-05-25 16:41:07 · 299 阅读 · 0 评论 -
【java_设计模式】外观模式
学习路径:https://coding.imooc.com/class/270.html前言两种模式都比较简单,往往是结合其他设计模式一起使用外观模式应用场景:当业务需要调用多个子系统的时候,不单独调用子系统,将用到的子系统封装成一个类给业务层。如:ShoppingService + TakeExerciseService + WatchMovieService ==> ...原创 2019-05-26 16:42:08 · 202 阅读 · 0 评论 -
【java_设计模式】单例模式 懒汉式 演进为双重检测锁
学习路径:https://coding.imooc.com/learn/list/270.html特点:十分【懒】,实例赋值为null, 让调用方来初始化【初步写法】public class LazySingleton { // 十分懒,类加载的时候不实例化 private static LazySingleton lazySingleton = null; // 私有构造器,是......原创 2019-05-22 17:09:30 · 348 阅读 · 1 评论 -
【java_设计模式】单例模式 静态内部类实现线程安全
学习路径:https://coding.imooc.com/learn/list/270.html前言加锁可以解决饿汉式单例模式的线程安全。【饿汉式】https://blog.csdn.net/chenghan_yang/article/details/90447741静态内部类静态内部类实现单例模式,本质也是【加锁】,只不过该锁加在【类初始化的过程】public cl...原创 2019-05-22 18:02:47 · 640 阅读 · 0 评论 -
【java_设计模式】单例模式 饿汉式
学习路径:https://coding.imooc.com/learn/list/270.html特点:该模式下的类十分饥渴,JVM装载类的时候就实例化对象。public class HungrySingleton { private final static HungrySingleton hungrySingleton = new HungrySingleton(); p...原创 2019-05-22 22:31:00 · 186 阅读 · 0 评论 -
【java_设计模式】适配器模式、spring相关
学习路径:https://coding.imooc.com/class/270.html前言适配器模式、外观模式、装饰者模式都存在语义上的共同点。装饰者模式和外观模式的区别:https://blog.csdn.net/chenghan_yang/article/details/90577600适配器模式的粒度与外观模式的粒度不同,适配器可以小到适配一个方法,但是外观模式是对子系统之...原创 2019-05-27 18:50:49 · 261 阅读 · 0 评论 -
【java_设计模式】单例模式 饿汉式反射攻击
前言反射攻击的本质是修改构造函数的访问权限,然后调用构造方法,防御的关键在构造方法中进行反射相关代码 Class objectClass = HungrySingleton.class; //Class.forName(HungrySingleton.class.getName()); 这种方式也能拿到对象 // 反射获取构造器 ...原创 2019-05-23 14:47:05 · 446 阅读 · 0 评论 -
【java_设计模式】单例模式 枚举实现
学习路径:https://coding.imooc.com/class/270.html代码public enum EnumInstance { INSTANCE; private Object data; public Object getData() { return data; } public void setData(O...原创 2019-05-23 16:00:31 · 384 阅读 · 0 评论 -
【java_设计模式】单例模式 反序列化攻击
学习路径:https://coding.imooc.com/class/270.html前言无论是【懒汉式】还是【饿汉式】的单例模式,不加以处理,都可以使用序列化和反序列化攻击。攻击代码 HungrySingleton instance = HungrySingleton.getInstance(); ObjectOutputStream oos = new Ob...原创 2019-05-23 16:16:30 · 316 阅读 · 0 评论 -
【java_设计模式】策略模式
学习路径: https://coding.imooc.com/class/270.html前言策略模式主要用于减少大量if else代码,在维护不同策略的时候有明显的优势。策略模式往往和工厂模式,享元模式,状态模式一起使用。应用场景public static void main(String[] args) { // 应用层传入一个key String ...原创 2019-06-05 13:09:40 · 134 阅读 · 0 评论 -
【java_设计模式】享元模式、Tomcat对象池相关
学习路径:https://coding.imooc.com/class/270.html前言享元模式一般不单独使用。其作用类似缓存,一块内存区域多端共享,减少重复操作,提高效率。应用场景1.系统底层开发,如JDK的Integer.valueof(x),x在[-128,127]这个区间的时候会直接去取内存中的“常量”对象,不在这个区间的就会new一个新对象。2.某个业务需要反复创建...原创 2019-05-28 18:27:52 · 245 阅读 · 0 评论 -
【java_设计模式】桥接模式
学习路径:https://coding.imooc.com/class/270.html应用场景可将一个事物的属性抽象出来并单独处理,可以使用该模式解耦。如XX银行的XX账户。银行可以是一个抽象体系,账户类型也可以是一个抽象体系。实现 public static void main(String[] args) { /* 传统的新建某人的某行...原创 2019-05-31 16:24:27 · 100 阅读 · 0 评论 -
【java_设计模式】代理模式 静态代理
学习路径:https://coding.imooc.com/learn/list/270.html应用场景增强被代理对象的实现,具体增强的途径增加前置方法:如过滤期望外的参数、选择数据库连接池、获取持久化的对等。增加后置方法:将被代理类的返回值封装、对返回值进行筛选等实现// 代理类持有被代理对象的引用,该对象是业务逻辑实现类 private IOrderServic...原创 2019-06-01 16:46:00 · 119 阅读 · 0 评论 -
【java_设计模式】观察者模式
学习路径: https://coding.imooc.com/class/270.html前言JDK对观察者模式提供了api,都在java.util.下面。观察者模式常常使用在处理消息,消息广播的业务上。应用场景网课中,答疑模块中,老师收到了学生的提问。学生提问,老师收到消息。老师回答问题,所有学生也能看到答案。这里的答疑模块(携带问题实体)连接了老师和学生两个实体,所以答疑模块(...原创 2019-06-07 21:21:31 · 103 阅读 · 0 评论 -
【java_设计模式】组合模式
学习路径:https://coding.imooc.com/class/270.html应用场景1.处理树形结构2.简化客户端的操作/** * 将目录和目录下的课程抽象成目录组件,方便地组合、删除、打印 * * @param args */ public static void main(String[] args) { ...原创 2019-05-29 22:35:16 · 183 阅读 · 0 评论