组合模式Composite
树状结构,有些包含子节点,有些只有自己 文件夹和文件的关系 快递包装和快递内容物的关系 实现 确保应用的核心模型能够以树状结构表示。 尝试将其分解为简单元素和容器。 记住, 容器必须能够同时包含简单元素和其他容器。 声明组件接口及其一系列方法, 这些方法对简单和复杂元素都有意义。 创建一个叶节点类表示简单元素。 程序中可以有多个不同的叶节点类。 创建一个容器类表示复杂元素。 在该类中, 创建一个数组成员变量来存储对于其子元素的引用。 该数组必须能够同时保存叶节点和容器, 因此请确保将其声明为组合接口类型。实现组件接口方法时, 记住容器应该将大部分工作交给其子元素来完成。 最后, 在容器中定义添加和删除子元素的方法。记住, 这些操作可在组件接口中声明。 这将会违反_接口隔离原则_, 因为叶节点类中的这些方法为空。 但是, 这可以让客户端无差别地访问所有元素, 即使是组成树状结构的元素。 注意下面实现中,容器实现的时候除了自己的增加和删除方法,继承自父接口的方法都是尽量去调用自己的孩子节点去处理,调用孩子节点的同样的方法,因为他的孩子也一定实现了这个方法。 1234567891...
群发红包系统
业务流程发红包 输入金额以及人数 创建红包订单(订单ID,金额,份数) 调用支付系统 红包订单支付之后红包就发出去了 钱先拆好(行锁分散,加大并发) 抢红包 抢红包业务群,检测当前是否有剩余钱 没有剩余直接返回,有剩余就将请求转发到Redis里面的list(先来先服务),同时将请求发到mq启动一个延时任务(对账作用),之后有一个worker调度中心监听Redis,也就是消费队列里面的消息。 抢红包业务群会阻塞轮询worker调度中心是否抢到红包,之后返回给用户,这个过程用户看来是同步的,只是在后端用Redis的list实现了简单排下队异步。 拆红包 抢到红包之后,计算红包的金额,计算更新剩余的红包的余额。 分支1:返回给用户 分支2:将拆红包的流水写到数据库里面(MQ异步记账) 红包结算(异常结算池) 红包入账 业务特点 个数少,人数少:小系统 个数多,人数少:美团。饿了么红包 个数多,人数大:微信群红包 个数少,人数多:春晚红包 设计思路 数据量大:分库分表 避免所有请求都到达DB:Redis 并发请求量大:Redis高可用 + 分布式ID + 消息队列 抢红包的...
自定义通用异常处理
生产级别的通用异常处理所有的异常都抛出,统一在表现层处理,其余直接抛出就好。 spring定义的错误响应方式如图所示。 使用Java提供的异常类抛出的时候只可以传递string,所以需要自定义一个异常类,继承RuntimeException,抛出的时候同时包含信息和状态码 新建通用异常处理类相当于aop里面的通知,起到拦截的作用,要做到通用,状态码不可以写死,这里的设计不对,后面会改进 src/main/java/com/deltaqin/common/advice/CommonExceptionHandler.java 12345678910111213141516171819package com.deltaqin.common.advice;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annot...
状态模式State
根据状态决定动作 不同状态下的同一动作有不同的实现,就是一个简单的多态。简单面向接口编程 应用:TCP 不同的状态下open close ack的方法的实现是不一样的,扩展方法是不方便的,方法不扩展可以使用状态模式 线程状态案例 线程是上下文 线程状态是State Running,Blocking等等是具体的状态 状态接口1234public abstract class ThreadState_ { abstract void move(Action input); abstract void run();} 具体状态123456789101112131415161718public class NewState extends ThreadState_ { private Thread_ t; public NewState(Thread_ t) { this.t = t; } @Override void move(Action input) { ...
装饰者模式Decorator
简单版防止类爆炸 类继承是会造成耦合度很高 用聚合代替继承,和代理不一样的是主动权在谁手里,聚合是主动的,自己知道的,代理是被动,自己甚至不知道 Component:抽象被装饰组件,定义都有哪些功能。 ConcreteComponent:抽象被装饰组件实现类 Decorator:抽象****装饰器,不一定是接口,它持有一个Component对象实例的引用,定义一个与抽象被装饰组件一致的接口; ConcreteDecorator:具体****装饰器,负责实现装饰器角色定义的功能。 详细版我们在做一个产品的时候,可能并没有考虑到新需求的场景,此时就需要为某些组件添加新的功能来满足这些需求。 如果要符合开放-封闭的原则,我们最好不要直接修改已有的具体实现类,因为会破坏其已有的稳定性。 继承,在某些场景下是不可行的,例如,要覆盖的方法被 final 关键字修饰了,那么在 Java 的语法中就无法被覆盖。使用继承方案的另一个缺点就是整个继承树的膨胀,例如,当新需求存在多种排列组合或是复杂的判断时,那就需要写非常多的子类实现。 应该尽量多地使用组合方式进行扩展,尽量少使用继承方式进行扩...
系统响应慢分析案例
响应很慢,这种情况下, 是不是系统资源出现 了瓶颈。所以,先观察 CPU、内存和磁盘 I/O 等的使用情况肯定不会错。 应用程序记录大量日志top ,来观察 CPU 和内存的使用情况 观察 top 的输出,你会发现,CPU0 的使用率非常高,它的系统 CPU 使用率(sys%)为 6%,而 iowait 超过了 90%。这说明 CPU0 上,可能正在运行 I/O 密集型的进程。 进程部分的 CPU 使用情况。python 进程的 CPU 使用率已经 达到了 6%,而其余进程的 CPU 使用率都比较低,不超过 0.3%。看起来 python 是个可疑 进程。记下 python 进程的 PID 号 18940 总内存 8G,剩余内存只有 730 MB,而 Buffer/Cache 占用内 存高达 6GB 之多,这说明内存主要被缓存占用。 CPU 使用率中的 iowait 是一个潜在瓶颈,而内存部分的缓存占比较大 iostat 命令,观察 I/O 的使用情况: 磁盘 sda 的 I/O 使用率已经高达 99%,很可能已经接 近 I&...
计网思维导图总结
计网思维导图总结内容较多,浏览器建议使用大纲查看。 processon
计算机系统数据表示
计算机里面的基本单位有哪些? 位:bit,二进制数(binary digit)的英文缩写 字节:Byte,8位 字:计算机的字由两个或多个相邻字节构成,处理器访问和处理的时候是按照字为单位进行,即这些字节被当做一个整体处理。字的大小(Word size)表示特定架构有效处理的数据最大大小,常见大小有16位32位64位。 比如16位可以表示的有符号位的最大整数是32767,32位可以表示的无符号位最大整数4294967295即232即内存大小限制4G,毕竟是要寻址的,再大无法表示地址。 32位操作系统int类型的最大值是 2147483647。 在32位操作系统下int类型取值范围如下: Int32 //等于int, 占4个字节(-2147483648~2147483647) 半字节:8位字节可以对半分为两个4位,称为半字节, 低半字节、高半字节:包含最小值二进制数字的半字节称为低半字节,另外半个字节为高半字节。 按位计数系统是什么?positional numbering systems 数字的值可以通过增加基数(基或底radix)的幂来表示,也叫做...
访问者Visitor
在结构不变的情况下动态改变内部元素的动作 适合用在接口结构基本固定不变的 实现案例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116package com.deltaqin.designPattern.d04_visitor;// 根据不同的访问者访问的不同商品,给不同的价格// 计算的规则定义在访问者上面,不同访问者对从商品获得的相同的信息实现自己的逻辑// 同一个被访问者传递给不同访问者的消息是一样的。public class Computer { ComputerPart cpu = new CPU(); ComputerPar...
责任链模式ChainofResponsibility
简单实现–实现链式调用以及调用链中断1234567891011121314151617interface Filter { boolean doFilter(Msg m);}class HTMLFilter implements Filter { @Override public boolean doFilter(Msg m) { String r = m.getMsg(); r = r.replace('<', '['); r = r.replace('>', ']'); m.setMsg(r); return true; }}// ... 其他具体的过滤器实现类 调用链也实现Filter接口,是为了可以两个链子连起来。也就是说把后面的链子当做过滤器的**List的最后一个元素。利用了多态,都实现了doFilter,但是具体的过滤器是...
