设计模式|⑧装饰者模式
今天我们要来聊的是装饰者模式,这个模式也是属于GOF23的结构型模式中的一个模式。
装饰者何为装饰?
比如美女脸蛋上抹点粉,这就是装饰。房子装修一下,这也是装饰。咖啡里面加点牛奶,这也是装饰……生活当中,这样的场景太多了。那装饰有啥用呢?装饰后,美女变得更加亮丽动人,房子住的更加舒适,咖啡口感更加丝滑……
说白了,装饰的作用就是在原来的基础上面,加点新功能,让原来的东西功能变得更好。就比如举个简单的例子,普通人都会跑步,但是能飞的肯定不是普通人,那是超人,那问题是,怎么才能成为一个像超人一样能飞的人呢?
123456789interface Man{ void action();}class CommonMan implements Man{ public void action() { System.out.println("我会跑步..."); }}
在原有基础上扩展功能很容易就能想到继承,所以可以如下实现:
123456789class SuperMan ...
设计模式|⑦适配器模式
今天我们要来聊的是适配器模式,这个模式和上篇讲过的代理模式一样,也是属于GOF23的结构型模式中的一个模式。
引子
❓何为适配器?
很经典的一个例子,就是插座:
假设,一台电脑需要用电,他的插头是两项插头,但是呢,插座却只有三项插孔的。怎么办?插座就在那里,是不可能改变的。我们总不能为了电脑用个电把整个电脑换了吧?不现实!那我们常用的做法就是买一个转接头,一面是两项插孔,一面是三项插孔。这样就很好的解决了这个问题。
这个生活中常见的场景就是经典的适配器模式的体现。
那现在让我用代码来实现一下,如下:
1234567891011//三项插座public class Dominate{ public void cost(){ ... //用电逻辑 }}//电脑public interface Computer{ void run();}
现在电脑运行需要使用电,说白了,Computer或者(实现类)的run()需要调用Dominate的cost()方法,怎么办?你可能会如下实现:
...
吞吐量、TPS、QPS、并发数、响应时间(RT)概念
响应时间(RT) (Response-time) 响应时间是指系统对请求作出响应的时间。直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下响应时间也不相同。所以,在讨论一个系统的响应时间时,人们通常是指该系统所有功能的平均时间或者所有功能的最大响应时间。当然,往往也需要对每个或每组功能讨论其平均响应时间和最大响应时间。
对于单机的没有并发操作的应用系统而言,人们普遍认为响应时间是一个合理且准确的性能指标。需要指出的是,响应时间的绝对值并不能直接反映软件的性能的高低,软件性能的高低实际上取决于用户对该响应时间的接受程度。对于一个游戏软件来说,响应时间小于100毫秒应该是不错的,响应时间在1秒左右可能属于勉强可以接受,如果响应时间达到3秒就完全难以接受了。而对于编译系统来说,完整编译一个较大规模软件的源代码可能需要几十分钟甚至更长时间,但这些响应时间对于用户来说都是可以接受的。
...
设计模式|⑥代理模式
今天我要跟大家聊的是代理模式。这一模式可以说是GOF23所有设计模式中应用最广泛,但又最难以理解的一种模式,尤其是其中的动态代理模式,但是其功能之强大,应用场景之广自然就体现出其重要性。有些场景要是没有使用这一模式,就会变得很难实现。可以这么说,我所了解过的或者阅读过源码的开源框架,底层几乎没有不用到代理模式的,尤其是接下去本文要说的重点-动态代理模式。因此,在文章的最后,我也会以一个在Mybatis底层使用动态代理模式解决的经典场景作为本文结束。
代理首先,我们先来说说代理。何为代理?来看张图。这就是我们日常租房的场景,客户来一个陌生城市需要租一个房子,但是他人生地不熟,根本不知道行情,也不知道地段,更没有房东的联系方式,所以,他会去找类似我爱我家之类的租房中介,而这些个中介手上会有大量房子的信息来源,自然会有个房东的联系方式,进而和房东取得联系,从而达到租房的目的。这个场景就是一个经典的代理模式的体现。
静态代理既然说到动态代理,自然联想到肯定会有静态代理。下面我们就先从简单的开始,以上面租房的这个例子,用Java代码实现静态代理。
首先在代理模式(甭管静态还是动态 ...
Java加密解密
常用的加密算法总体可以分为两类:单向加密和双向加密,双向加密又分为对称加密和非对称加密,因此主要分析下面三种加密算法:对称加密算法、非对称加密算法和单向加密算法(Hash算法)。
双向加密对称加密算法(AES、DES、3DES、PBE)
AES:(Advanced Encryption Standard), 高级加密算法,这个标准用来替代DES。
DES:(Data Encryption Standard),即数据加密算法。
3DES:(Triple DES),即三重数据加密算法,是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
PBE:(Password-based encryption),即基于密码验证。
对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。
AES加密算法是密码学中的高级加密标准,采用的是对称分组密码体制,密钥长度的最少支持为128。AES加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界使用。
优点:加密速度快。
缺点:密钥的传递和保存是一个问题,参与加密和解密的双方使用的 ...
设计模式|⑤建造者模式
今天我们要来聊的是建造者模式,这也是GOF23的创建型模式中的最后一个模式。既然是创建型模式,自然又是一个用来创建对象的模式,这从这个模式的名字上也能看出来。
场景需求建造者,就是用来创建对象的。这听上去就是一句废话……
对象不就是建造出来的吗?这怎么还成了一个单独的模式了?而且和前面说的那些模式有啥区别?
为了方便理解,我还是不套用书上或者网上的一些理论,但就自己学过的一些理解,结合生活的一些场景跟大家说说。
举个生活当中组装电脑的例子,比如现在小明去电脑城组装一台电脑,一台完整电脑肯定会包含显示器,键盘,鼠标等等一些配件,而每个配件的配置参数那就成百上千了,而且每个硬件上都会有一些专业的参数我们也看不懂。然而,我们需要买的只是一台电脑,我们只需要告诉卖电脑的人,我们需要买什么品牌,什么档次,什么价格的电脑或配件即可,这样电脑商家就会给我们组装好一台各方面都比较合适的电脑。小明平时就简单写个文档看个视频啥的,对配置要求不高,所以只需要入门级的电脑即可。如下图:然后小明玩了几年后上了大学,无意中染上了玩游戏的毛病,一发不可收拾,原来的电脑配置已经卡出翔了。于是,他又想换 ...
设计模式|④原型模式
今天我们接下来要聊的是原型模式。
❓何为原型?
维基百科上给出的概念:原型是首创的模型,代表同一类型的人物、物件、或观念。
以我的理解能力解释一下,就是说,它是一种类型的首创对象。在面向对象编程中,所谓的类型就是指类,也就是说,它是这个类的一个源实例。
为什么需要原型模式?我还是坚持前面几篇一贯的风格,在深入了解该模式之前,先来思考一下,这个模式它出现的原因以及存在的意义是什么?
首先,这个模式也是属于创建型模式,也是用来创建对象。还是回到之前反复说过的一个问题,就是我们创建对象为什么一定要使用原型模式呢?
像之前我们学过的单例模式是因为需要控制对象个数必须是单个。工厂模式是需要将对象创建和使用解耦,使得可以在不需要知道创建细节而使用一个对象,那今天要学习的原型模式它用在创建对象上又是出于什么原因呢?
举个简单例子
比如某一个公司有A和B两个产品线,现在假设需要在每一个产品销售出去之前做一次检查,检查标准是,假如该产品的重量超过10kg,就重新生产一个新的。现在希望将所有产品的检查逻辑用同一个通用方法实现,并且后续增加新产品后可以方便扩展,怎么实现这个需求?
你 ...
脚本语言Lua-OpenRestry
OpenRestry最佳实战(资料)LuaJIT安装OpenResty官网
Demo方式一:hello.lua:
12#!/usr/bin/luaprint("Hello World!")
执行./hello.lua
方式二:helloworld.lua:
1print("Hello World!")
执行lua helloworld.lua
在常用基本类型中,除了table是按址传递类型外,其它的都是按值传递参数。 用全局变量来代替函数参数的不好编程习惯应该被抵制,良好的编程习惯应该是减少全局变量的使用。
设计模式|③工厂模式
今天我们开始一个新的模式——工厂模式。工厂模式作为本系列第二个登场的角色,可想而知它的重要性了。另外和单例模式相比,工厂模式会相对复杂一些,因为单例模式只涉及一个对象,而工厂模式会涉及到多个对象。而且这一模式在实际开发中,那真的是应用得太太太太太太™广泛了……😱再多的太都不足形容。因此,这个模式也是我们需要深入掌握的一个模式。
为什么需要工厂模式看过我之前写的文章的应该都清楚我的风格,学一样东西,我会先简单思考一下,这玩意到底有啥用,学了能帮我解决什么,才能决定我如何学以及学习的深度。同样,今天学习工厂模式,我们先来看看.
❓工厂模式是个什么玩意?到底有什么用?为什么会出现这一模式?帮我们解决了什么问题?如果没有它会怎么样?
工厂模式,顾名思义,跟工厂有关。何为工厂?工厂就是用来生产产品的,例如汽车工厂用来生产汽车,粮食工厂用来生产粮食等。那在面向对象软件开发领域,自然是用这种模式来生产对象的。所以工厂模式也是属于之前说过的创建型模式。那老问题来了,平时我们创建一个对象大多数情况都是直接new一下不就有了吗?为什么非要按照你工厂模式的套路来创建对象?
为方便理解, ...
设计模式|②单例模式
今天要和大家分享的是GOF23模式中第一个模式——单例模式。这个模式号称是GOF23所有设计模式中最简单的一个设计模式。不过,等你看完这篇文章后会发现,这句话听听就好,别当真。😂单例模式简单吗?这是不存在的,要想吃透里面的细节并不容易,尤其是初学者。但是单例模式在实际生活和开发中,却是大量的被使用到,因此,这个模式我们是需要深入学习掌握的。下面不废话直入主题。
为什么要使用单例模式单例模式属于上篇说过的设计模式三大分类中的第一类——创建型模式,自然是跟对象的创建相关,而且听这名字——单例,也就是说,这个模式在创建对象的同时,还致力于控制创建对象的数量,是的,只能创建一个实例,多的不要。或者从这一方面讲,它确实是最简单的模式。每个Java程序员都知道,Java中的对象都是使用new关键字来加载类并在堆内存中开辟空间创建对象,这是平时用到最多创建对象的方式。也知道每次new都会产生一个全新的对象。一直这样用着,好像从来没觉得有啥不好,更没有怎么思考过,这玩意居然还要去控制它的数量。
那么问题来了,到底我们为什么要控制对象创建的个数?直接new一下多省事啊❓
既然这个模 ...