Fork me on GitHub

设计模式-观察者模式

设计模式-观察者模式

观察者模式(Obersver)

  • 观察者模式是使用频率非常高的模式了,它定义了对象间一种一对多的关系,使得每当一个对象改变状态,则所有依赖它的对象都会收到通知,并且自动更新。
  • 例如:Java中的监听器Listener用的就是观察者模式。

UML类图:

mark

  • Subject: 具有注册和移除观察者,并且通知观察者的功能,主体是通过某种数据结构(可能是列表)来维护一张观察者列表实现这些操作的。
  • 观察者(Observer)的注册功能需要调用主体的registerObserver()方法。
阅读更多...

Leetcode-031-下一个排列

Leecode-031-下一个排列

题目描述

  • 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

  • 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

  • 必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1

阅读更多...

Netty-13-TCP粘包和拆包

Netty-13-TCP粘包和拆包

前言

  • TCP是面向连接的,面向流的,提供高可靠性服务。
  • 收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。
  • 这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界

通常的解决方案

  1. 发送端每发送一次消息,就需要在消息的内容之前携带消息的长度

  2. 这样,接收方每次先接受消息的长度,再根据长度去读取消息剩余的元素

  3. 如果 socket 中还有没有读取的内容,也只能放在下一次读取事件中读取

阅读更多...

Leetcode-127-单词接龙

Leecode-127-单词接龙

思路:BFS/双向BFS

1
2
3
4
5
6
7
8
9
10
11
12
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。

说明:

如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出: 5

解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
返回它的长度 5。


示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出: 0

解释: endWord "cog" 不在字典中,所以无法进行转换。
阅读更多...

Netty-12-handler调用机制

Netty-12-handler调用机制

前言

  • netty的组件设计:Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe
  • 我们先来复习一下ChannelHandlerChannelPipeline的关系。示例图如下:我们可以将pipeline理解为一个双向链表,ChannelHandlerContext看作链表中的一个节点,ChannelHandler则为每个节点中保存的一个属性对象。

mark

阅读更多...

Leetcode-057-插入区间

Leetcode-057-插入区间

题目描述

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

1
2
3
4
5
6
7
8
9
10
示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
阅读更多...

Leetcode-941-有效的山脉数组

Leetcode-941-有效的山脉数组

思路:线性扫描

题目描述

1
2
3
4
5
6
7
8
给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。

让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:

A.length >= 3
在 0 < i < A.length - 1 条件下,存在 i 使得:
A[0] < A[1] < ... A[i-1] < A[i]
A[i] > A[i+1] > ... > A[A.length - 1]

mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
示例 1:

输入:[2,1]
输出:false

示例 2:

输入:[3,5,5]
输出:false

示例 3:

输入:[0,3,2,1]
输出:true
阅读更多...

Netty-10-WebSocket

Netty-10-WebSocket

前言

实例要求

  • Http 协议是无状态的,浏览器和服务器之间的请求只响应一次,下一次会重新创建连接
  • 要求 : 实现基于webSocket 的长连接全双工的交互
  • 改变Http 协议多次请求的约束,实现长连接,服务器可以发送消息给浏览器
  • 客户端浏览器和服务器端会相互感知,比如服务器关闭了,浏览器会感知,同样浏览器关闭了,服务器会感知
阅读更多...

Netty-11-ProtoBuf

Netty-11-ProtoBuf

前言

  • 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据的时候就需要编码,接收数据时候就需要解码
  • codec(编解码器)的组成部分有两个
    • decoder(解码器) : 负责把字节码数据转换成业务逻辑
    • encoder(编码器) : 负责把业务数据转换成字节码数据

mark

阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信