设计模式
程序员驴子酱
IT社区Java技术布道者
展开
-
详解责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。Abstracthandler类提供了get和set方法,方便MyHandle类设置和修改引用对象,MyHandle类是核心,实例化后生成一系列相互持有的对象,构成一条链。public interface Handler { publi原创 2020-10-30 15:34:34 · 309 阅读 · 0 评论 -
模板方法模式(Template Method)
一个抽象类中,有一个主方法,再定义1…n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用public abstract class AbstractCalculator {原创 2020-10-30 15:31:17 · 64 阅读 · 0 评论 -
详解策略模式(strategy)
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:图中ICalculator提供同意的方法,AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:首先统一接口:public interface ICalculator { public int calculate(St原创 2020-10-30 15:29:57 · 361 阅读 · 0 评论 -
JAVA中的Comparable接口和自定义比较器
Java中的自然排序自然排序定制排序自然排序TreeSet集合在存储数据时有一定的顺序,它会将一些数据进行比较,比较调用的是comparaTo()方法,该方法是在Comparable中定义的,自然排序要求TreeSet集合中存储的数据必须实现Comparable接口,并且重写ComparaTo()方法public class 自然排序 {public static void main(String[] args) {//定义一个TreeSet集合TreeSet treeSet = new T原创 2020-10-12 20:02:00 · 74 阅读 · 0 评论 -
继承、多态 中那些你该知道的知识
面向对象编程一、继承:二、多态:一、继承:有的时候客观事物之间就存在一些关联关系,那么在表示成类和对象的时候也会存在一定的关联。例如 猫它是动物,就具有动物的基本属性,当我们定义猫这个类时,有些动物属性我们没必要重复定义,只需要让猫这个类继承动物这个类就可以了。(代码的复用,降低了代码冗余)1、表现形式: A extends BA: 子类 、 派生类B: 父类 、 基类 、 超类2、子类继承了父类的什么?(BAT 面试)除 构造方法 外的所有东西 !!!(子类需要去帮助父类构造方法,原创 2020-10-12 19:59:03 · 82 阅读 · 0 评论 -
详解享元模式(Flyweight)
享元模式(Flyweight)享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来原创 2020-09-29 16:38:12 · 97 阅读 · 0 评论 -
详解组合模式(Composite)
组合模式(Composite)组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便。直接来看代码:public class TreeNode { private String name; private TreeNode parent; private Vector<TreeNode> children = new Vector<TreeNode>(); public TreeNode(S原创 2020-09-29 16:34:51 · 190 阅读 · 0 评论 -
详解桥接模式
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。好,接下来看一下代码如何实现:实现代码:public interface Sourceable { public void m原创 2020-09-29 16:32:33 · 170 阅读 · 0 评论 -
@RequestBody注解的使用场景解析
最近在做一个项目的过程中,碰到前端传过来有值,后端接收不到,开始还以为是属性名不一致导致的,反复检查也没找到属性名不一致的问题,后面才发现问题所在,先上图:前端是通过json穿过来的一个对象,后端代码如下:后来改成如下代码:以前最开始使用mvc时没太留意这个区别,找资料后整理@Requesbody的用法区别如下:1 GET、POST方式提交时, 根据 request header Content-Type 的值来判断:1.1application/x-www-form-urlencoded:原创 2020-09-25 11:38:11 · 288 阅读 · 0 评论 -
Vue源码分析-数据劫持
数据劫持(数据绑定)observer给配置对象data对象中的数据进行劫持 给data中的每个属性重新定义get和set 为data中每个属性创建dep对象compile在解析表达式的时候会创建对应的watcher对象,并建立watcher与dep的关系,dep在进行数据劫持时,给data每个属性都对应一个dep对象 dep对象结构:id – 每个dep对象的唯一标识,subs—包含多个watcher对象的数组特殊说明:当模板编译时,每个表达式编译会创建watcher对象,会将原创 2020-09-08 13:37:46 · 369 阅读 · 0 评论 -
Vue源码分析-模板解析
模板解析模板解析流程:将el的所有节点取出,放在文档碎片fragment对象中 将fragment对象的所有子节点进行递归解析处理 插值语法解析 对插值语法(表达式)进行解析(与v-text指令解析一致),使用compileText方法 根据正则对象获取匹配到的表达式字符串 从vm实例上找到表达式对应的值 将属性值设置为文本节点的textContent 指令解析 一般指令解析 从标签节点中获取到指令名和表达式 从vm实例上拿到表达式的对应的值.原创 2020-09-08 13:37:11 · 393 阅读 · 0 评论 -
java泛型和类型擦除
java泛型和类型擦除泛型的本质是参数化类型,这种参数类型可以用在类、接口和方法的创建中。泛型是在JAVA 1.5版本中才引入的,它能和以前的版本兼容的原因是泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,即类型擦除。根据使用情况可以分为以下三种:泛型类泛型方法泛型接口下面是一个常用的泛型类:// 一个泛型类,可以根据需要包装不同结果的返回值public class Result<T> { private boolean success原创 2020-09-03 14:35:35 · 123 阅读 · 0 评论 -
Springcloud之Gateway入门
API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:破坏了服务无状态特点。为了保证对外服务的安全性,我们需要实现对服务访问的权限控制,而开放服务的权限控制机制将会贯穿并污染整个开放服务的业务逻辑,这会带来的最直接问题是,破坏了服务集群中REST API无状态的特点。从具体开发和测试的角度来说,在工作中除了要考虑实际的业务逻辑之外,还需要额外考虑对接口访问的控制处理。原创 2020-08-31 17:39:20 · 158 阅读 · 0 评论 -
Springcloud和dubbo的区别
随着近几年微服务的兴起,最近大家对springcloud和dubbo的讨论越来越多,那么下面我们简单来看看这两者使用中的不同有哪些,以下观点仅供参考。1、 架构完整度(见上图)或许很多人会说Spring Cloud和Dubbo的对比有点不公平,Dubbo只是实现了服务治理,而Spring Cloud下面有17个子项目(可能还会新增)分别覆盖了微服务架构下的方方面面,服务治理只是其中的一个方面,一定程度来说,Dubbo只是Spring Cloud Netflix中的一个子集。但是在选择框架上,方案完整度原创 2020-08-31 17:34:52 · 1201 阅读 · 0 评论 -
详解外观模式
外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)我们先看下实现类:public class CPU { public void startup(){ System.out.println("cpu startup!"); }原创 2020-08-26 15:26:01 · 228 阅读 · 0 评论 -
详解装饰模式
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:public interface Sourceable { public void method(); } public class Source implements Sourceable { @Override原创 2020-08-26 15:25:14 · 76 阅读 · 0 评论 -
详解建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender。最后,建造者类如下:public class Builder { private List<Sender> list = new ArrayList<Sen原创 2020-08-26 15:21:42 · 101 阅读 · 0 评论 -
谈谈你对JMM的理解和认识?
JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组 规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步的规定:1线程解锁前,必须把共享变量的值刷新回主内存2线程加锁前,必须读取主内存的最新值到自己的工作内存3加锁解锁是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一-个工作内存(有些地方称为栈空间),工作内存是每个线程 的私有数据区域,原创 2020-08-03 15:27:49 · 461 阅读 · 1 评论 -
详解原型模式
原型模式(Prototype)原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。在Java中,复制对象是通过clone()实现的,先创建一个原型类:public class Prototype implements Cloneable { public Object clone() throws CloneNotSupportedException { Proto原创 2020-08-03 15:24:17 · 148 阅读 · 0 评论 -
详解单例设计模式
什么是单例模式?单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。从概念中体现出了单例的一些特点:在任何情况下,单例类永远只有一个实例存在单例需要有能力为整个系统提供这一唯一实例在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当原创 2020-08-03 15:22:28 · 257 阅读 · 0 评论 -
详解工厂设计模式
设计模式分类先来说说设计模式的分类,主要分为以下大类:创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。并发型模式和线程池模式。1.普通工厂模式建立一个工厂类,对实现了同一接口的一些类进行实例的创建。举例如下:(我们举一个发送原创 2020-08-03 15:19:53 · 164 阅读 · 0 评论 -
Java的设计原则
设计原则单一职责原则(single Responsiblility principle,SRP)一个类只做它该做的事情。单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚、低耦合"开闭原则(Open Close Principle)开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级,我们需要使用接口和抽象类。能用抽象类的别用具体类,能用接口的别用抽象类。面向接口编程(在理想的状态下,原创 2020-06-30 18:00:28 · 105 阅读 · 0 评论