陈志军

物来顺应,未来不迎,当时不杂,既过不恋


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索

Java设计模式-模板方法模式

发表于 2017-10-09 | 分类于 Java | 阅读次数

模板方法设计模式

简述

模板方法模式,它其实肯定是有一个模板的.模板是什么?就是假定的标准.而这个标准由我们定义.模板方法指什么了?它就是封装了一系列操作到一个方法里面.为啥这么说?看生活中的一个实例:

生活例子

  • 泡咖啡: 如果我们想要喝咖啡,我们会怎么做?
    1. 烧水;
    2. 放咖啡;
    3. 选个马克杯子;
    4. 加点牛奶或糖.

泡一杯咖啡,我们大概就是这样操作.让我们再看看有些人不喜欢咖啡,喜欢喝茶.那么应该是怎样了?

  • 泡茶: 如果喜欢喝茶,泡一杯茶怎么做?
    1. 烧水;
    2. 放茶叶;
    3. 选个保温杯?;
    4. 加奶或者加柠檬?.加点奶变奶茶,或者加点柠檬变成柠檬茶?
      阅读全文 »

Spring周报翻译 - 2017年10月3日周报

发表于 2017-10-09 | 分类于 Spring周报翻译 | 阅读次数

10月3号周报

今日突然兴起,想翻译文章,其实之前的我在LinuxCN上也翻译过,只是那边大多是Linux的文章,其实我想翻译Java周边的。那边的文章我也有翻译过,只是总觉得缺少什么,后来接触了Spring4ALL,也就随口问了下,没想到还竟然有人回复了我,所以也就有了下面这篇文章,算作投名状吧。

其实,能翻译我还是很高兴的,因为我觉得那26个字母非常可爱。^_^

下面是是10月3号在Spring官网看到的周报内容,取出主要内容作为本文主体:

  1. 怎么使用Spring Framwork5来构建基于websocket的响应式应用

  2. Spring AMQP和Spring Integration开发领导者Gary Russell发布了Spring AMQP 2.0.RC2。

  3. 经过一段长的时间,Spring Framework 5.0.GA现在终于发布了!新版本集成了Reactor项目,包括响应式web运行时环境,Kotlin扩展,以及全面基于Java EE 7和Java 8。
    新的发行版具有太多的新东西,如果想要知道更多的消息,查看版本说明,然后查看更新内容

阅读全文 »

Java设计模式-命令模式

发表于 2017-10-04 | 分类于 Java | 阅读次数

设计模式-命令模式

命令模式是啥啊?感觉从字面上来理解,就是命令-执行.那么谁下命令?谁执行?执行的人从哪里知道命令?又怎么知道要执行哪些命令?
命令模式的定义: 将’请求’封装成对象,以便使用不同的请求,队列或者日志来参数化其它对象.命令模式也支持可撤销的操作

命令模式

让我们假设一件事情,如果有个遥控器,上面有个按钮,按钮可以控制家里的一件东西,比如说开关门,开关灯,开关电视.那么我们该怎么做了?
其实这个就相当于一个命令模式了.人是下命令的.也就是按钮执行就是一个命令,按钮对应了什么操作,按下的操作,这个操作怎么执行了?是门执行,还是灯去执行,还是电视了?
如果可以,我们可以想想另外一个例子:下馆子.通常我们去到餐馆,服务员给个菜单,然后我们写上我们要吃的菜;完事之后服务员拿走菜单,然后告诉厨师,厨师拿到菜单后开始炒菜.
这个过程中,”我们”就相当于一个客户端,我们将菜品(请求)封装成了一个订单对象.服务员拿到请求,告诉厨师请求来了,厨师拿到订单看到里面的菜品(命令)就开始执行.

阅读全文 »

Java设计模式-工厂模式

发表于 2017-10-04 | 分类于 Java | 阅读次数

工厂模式

最近看了很久的工产模式,一直没敢下笔。因为我发现我就算弄了很久也就明白了简单工厂和工厂模式,抽象工厂一直没有弄的太明白。今天想着不如试试看,至少先把自己会的记录下来吧,不然越久越容易忘记了。

工厂模式定义:定义了一个创建对象的接口,但由子类决定实例化的具体对象是哪个.工厂方法让类把实例化推迟到了子类中.

工厂简述

想想一个例子,假如我们想吃批萨,那么如果是简单的话,我们可能就买个面粉自己揉几下然后放到烤箱里面。只要出来的时候是个饼的形状,也就差不多了(对我这种不调食的人来说…)。但是我们可能还有一些有追求的人,他可能想吃海鲜批萨,可能想吃芝士批萨,可能想吃原味批萨。这么多要求,你觉得在家里自己做麻烦么?麻烦怎么办?丢个别人呗。那么我们就建个工厂,专门给我们做批萨,而我想吃什么批萨的时候,打个电话过去,告诉它给我做个什么口味的批萨,然后它把吃的给我送过来就好了。这种方式就基本上就是一个工厂模式了。
很显然,我们将”做批萨解耦出来了。工厂负责做批萨,而我只要批萨就行,至于你批萨是怎么做的,你工厂随便弄,最后给个批萨给我,就行。

阅读全文 »

第三方授权登录(oauth2)--Github授权登录

发表于 2017-09-29 | 分类于 Java | 阅读次数

第三方授权登录-github授权登录

现在时下的框架都是非常流行第三方的授权登录,比如QQ,微信,微博,或者github等等,都是基于OAuth2授权令牌。

前期的准备

在现在很多互联网项目当中很少没有第三方登录的,本来想用QQ或者微信来弄,但是发现认证有点麻烦,后来看到github上面的授权很简单,几乎只要有一个github账号就能开始开发了。其实不管是哪个平台授权登录,只要了解了一个原理,其它的都类似了。整个流程图如下:
2017-09-29-16-25-04

github 账号

默认已经有了,如果没有的话作为开发者还是去注册一个吧,不多说了。

注册一个应用

注册一个我们的应用,该应用就是我们需要用第三方授权登录的应用,github有个好处,可以用127.0.0.1直接挂到本地进行测试,不知道其他的第三方可不可以,还待验证。
2017-09-29-15-55-40

阅读全文 »

ThreadLocal 类解析

发表于 2017-09-28 | 阅读次数

ThreadLocal 类解析

什么是ThreadLocal

JDK里面关于ThreadLocal的解释就是:它提供一个线程局部变量,很拗口对不对,没错就是这么拗口,所以你用的少,我们都用的少。它其实就是说,在一个类里面,这个类可以被很多线程访问,那么ThreadeLocal给这些线程,每一个分配一个他们自己私有的局部变量。还是拗口对不对?不着急,现在只要知道,它就是给多线程环境下,每个线程分配一个单独的变量。

ThreadLocal 的组成

我们用idea看看ThreadLocal里面含有什么东西:
2017-09-29-17-21-04

初一看貌似挺多的。其实在这个里面它主要实现了一个Map,如果你还记得它是为每个线程分配一个独立的变量,那么也就不难理解,它其实就是往map里面给每个线程设置了一个变量给他们使用。
然后看看ThreadLocal,主要就是几个方法:get(),set(T),initialValue(),remove(),其中initialValue是protected:

阅读全文 »

RabbitMQ-消息中间件(六)RPC

发表于 2017-09-26 | 分类于 RabbitMQ | 阅读次数

RabbitMQ-消息中间件(六)RPC

Remote Procedure Call (RPC)

第二节讲过可以将耗时的任务通过工作队列给多个工作线程,如果我们想要调用一个在远程其它服务器上的一个功能并且等待它执行完后的结果,我们应该怎么做?是的,这是一个不同的场景,这种模式被叫做Remote Procedure Call或者说是RPC。

在本节中,我们准备使用RabbitMQ来构建一个RPC系统。一个客户端和一个可扩展的RPC服务端。如果我们没有耗时的任务,那么就值得转发,我们准备建造一个仿RPC服务,并且它返回一个斐波那契数。

客户端接口

为了演示一个RPC服务是怎样被调用,我们准备创建一个简单的客户端。它暴露出一个叫call的方法接口,通过这个接口发送RPC请求,并且等待返回结果。

阅读全文 »

RabbitMQ-消息中间件(五)Topics

发表于 2017-09-25 | 分类于 RabbitMQ | 阅读次数

RabbitMQ-消息中间件(五)Topics

Topics 前言

上一章我们写了个路由日志系统,用direct的放交换机,比较了fanout和它之间的区别,一个是广播,一个是绑定。
尽管我们使用direct交换机做了改进,但是它还是有一些限制,它没法根据不同的几个规则了区分。我们之前的日志是分了四种:info、debug、warn、error。但是我们可能实际中了,对error又分为系统错误或者业务错误。有时候我们针对业务开发,就不想去管理系统错误,那怎么办?
为了再一次提高我们的日志系统,我们需要学习另一种交换机:topic交换机。

Topic exchange

发送给top交换机的消息不能随意定义routing_key,它必须是一串单词,并且用点.分开。这些单词可以任意定义,通常他们是描叙这些消息的共同特点。routing key示范例如:stock.usd.nyse,nyse.vmw,quick.orange.rabbit。你可以定义你喜欢的任何单词,不过记得总共不能超过255 bytes。

阅读全文 »

RabbitMQ-消息中间件(四)路由

发表于 2017-09-25 | 分类于 RabbitMQ | 阅读次数

RabbitMQ-消息中间件(四)路由

路由

上面一节我们用交换机fanout的方式进行了广播,这种方式如果在不需要对消息进行区分是没关系的,可以使用。但是有些场景下,比如日志打印,对于一些error的日志,我可能需要的是要保存到磁盘中进行持久化,而对于一些warn,info的日志,我可能只是想着输出下就可以了。那么这种情况下我们还用fanout的方式可能就不行了,我可能想要的是某一个队列接受特定的某一类消息做特别处理。比如我想要一个error队列专门来监听error的消息做打印,其它的队列就不管error的消息了。

绑定(Bingdings)

在前面,其实我们已经创建过“绑定”了。比如我们使用到了:channel.queueBind(queueName, EXCHANGE_NAME, "");,“绑定”:中文意思就是你和我之间有些关联,我们之间有关系;那么MQ也是,它的关联是队列和交换机,它绑定的是队列和交换机的关系,也就是说,这个队列对这个交换机感兴趣,会接受这个交换机的信息。但是接受什么消息了?这个可以在绑定的时候用另外一个参数来设置,也就是路由:俗成绑定的key。channel.queueBind(queueName, EXCHANGE_NAME, "binding key,set by yourself");。这里我们可以看到,绑定key是否生效其实是跟交换机类型相关的,如果交换机是fanout,那就跟key没关系了,因为它是广播,只要有队列绑定到我交换机,产生了关系,我就懒的管你要不要,直接给你。这个有点类似中国爸妈,你是我孩子,只要我想给,你不要也得要,哈哈。

阅读全文 »

Java设计模式-单例模式

发表于 2017-09-23 | 分类于 Java | 阅读次数

设计模式-单例模式

简述

单例应该是最简单也是最常用的模式了。单例模式通常用在当一个系统只需要唯一一个类,比如线程池,日志打印等。单例模式的类就只有一个,听起来很简单,但是要写好单例却不容易。不信你自己先想想怎么保证系统里面只有一个单例?

单例模式:确保一个类只有一个实例,并且提供一个全局访问点

单例实践

要保证单例的第一步就是要保证类不能随意实例话,new 一个对象的代价是很简单的比如:new Object()。但如果不能new了?没错,我们第一步就是让构造方法私有话,不会对外开放private ObjectConstractor();但是如果我们还是需要使用这个类怎么办了?一个最简单的单例模式就可以写出来了:

阅读全文 »
1…131415…18

180 日志
41 分类
70 标签
RSS
GitHub GitEE
推荐阅读
  • 陈志军的个人站
© 2017 - 2023 陈志军
由 Hexo 强力驱动
主题 - NexT.Muse