简单的验证码架构(1)
来源:互联网 发布:广州知伴科技有限公司 编辑:程序博客网 时间:2024/05/20 16:32
嘛是架构?
说到架构的话,很多朋友会觉得这是个很高深的东西。其实不然,基本上任何一套程序都有架构,好与坏而已。我们常说的,三层架构,这也是一种,还有设计模式,我也认为这是架构的一种,还有很多很多ORM架构啊之类的。
架构的目的
架构的目的就是方便开发,提高效率,节约时间,基本上应该是这样。说技术点,就是把类啊,方法呀,属性啊,采用最方便的方式提供给外界人使用,最后实现最终的功能。最典型的就是ORM了。说到底了就是封装
封装是什么我就不说了,一搜一大片,很多朋友比我都会,我就说说封装要注意什么吧。
其实主要是一种编程习惯,毕竟你的封装,是给外界开发人员进行使用,所以你需要注意
1、命名规范。看不懂的abc,搞不明白的拼音缩写,很头疼的事情啊。很多时候,你可以从微软的命名规范上就能知道这个类、方法、属性是做什么的,根本不用查文档。
2、注释。没注释非常讨嫌。光看名字不能理解做什么的话,没注释,那别人都懒得用了。传什么参数,需要什么格式,你不说明下,谁知道呢?
3、文档。具体使用方式当然是作者最清楚,所以需要写文档示例。
最好的验证方式就是,过几周,几天的,你自己用一下自己封装过的东西,你看看你能不能明白。
言归正传吧~~
我用一个验证码的需求来解释一下我理解的架构和封装
需求分析
首先我们得知道我们的需求,就是实现页面上的验证码。当然,会有不同的实现方式,每个项目展示的样子不一样。所以呢你不可能每个项目都做一个,这个时候你就得做一套公用的验证码生成架构,大家调用相应的方法、参数,就可以直接实现想要效果。
先总结一下验证码需要什么参数吧
1、背景颜色(也许会有人用粉红色做背景呢)
2、字体大小(也许这个系统是给近视眼的人用)
3、字体颜色(也许有些人想来点独特效果)
4、字体(也许某些系统不支持宋体)
5、字体方式(斜体?加粗?我都想要呢)
6、画直线(某系统需要)
7、画弧线
8、画噪点
9、画布大小(宽度、长度)
.....
尽可能的想出参数使用的可能性,这也是封装和架构中必须的思维
以上参数,我想我们可以进行一下总结,再提炼出公共部分
1、颜色(背景颜色,字体颜色)
2、字体(文字、大小....)
3、画图(直线、弧线....)
4、画布(宽度、长度....)
.......
现在有一个关键问题,定义接口还是定义类?
先分析下我们封装的目的
1、封装是为了将复杂的逻辑封闭起来,外部直接进行调用,不用管里面的实现
2、封装是为了快速的得到一个结果
3、封装是为了通过设置获得不同的结果
以上情况我们可以封装成一个类。因为我只想要一个结果
那接口是什么呢?
接口是提供一种规范,也就是说,当我继承这个接口的时候,我就具备这个功能了。但要做成什么样的成品,就是靠我自己的。
举个通俗的例子,就好比我现在想要一幅画,是买一幅画还是自己画一幅画。
如果是买一幅画,那就直接调用别人的类和方法吧。
如果是画一幅画,那就得问问自己需要什么?比如:画笔,纸张,尺子等等工具。那我自己没有这些工具,找能提供这些工具的,画笔得去文具店,纸张得去卖纸的店,尺子得去卖尺子的店,具体怎么去画,那就是我自己的事情了。
估计被我说晕了吧?
那我们就看看代码
我们定义一个颜色的接口,叫IColor。
用处:当需要用到颜色的时候就可以直接使用该接口。
/// <summary> /// Define color interface. Only one property of color has defined. /// </summary> public interface IColor { /// <summary> /// Gets or sets color name. It can be name of color or color code. /// </summary> string ColorName { get; set; } }
这个接口只有一个参数,就是接收一个Color的代码或者是名字。例如“red”或者"#ff0000"
定义一个字体接口
用处:大小、字体、颜色等等。
/// <summary> /// Define the font. /// </summary> public interface IFont { /// <summary> /// Gets or sets the size of font. /// </summary> int FontSize { get; set; } /// <summary> /// Gets or sets the font families. /// </summary> string[] FontFamily { get; set; } /// <summary> /// Gets or sets the font colors. /// </summary> IColor[] FontColor { get; set; } /// <summary> /// Gets or sets the font style /// </summary> FontStyle FontStyle { get; set; } }
注意:这里的FontColor的返回类型是IColor接口。
数组类型,是为了做一个多字体颜色的提供者。之前说过,有可能会有人来一个特殊的玩法,比如:我想一个字母一个颜色;同理,FontFamily也是定义了一个数组。当然你也可以尽可能提供更多,比如FontSize也是数组,FontSytle也可以是数组。
谁会这么变态?每一个验证码都是不同大小不同字体不同粗细不同颜色???
接下来是背景颜色
/// <summary> /// Define a background-color /// </summary> public interface IBackgroundColor { /// <summary> /// Gets or sets the background-color /// </summary> IColor BackgroundColor { get; set; } }
同样的是用了IColor接口
画布接口
public interface IGraphic:IBackgroundColor { int Width { get; set; } int Height { get; set; } System.Drawing.Graphics Grapic { get; } }
这个时候,IGraphic接口继承了IBackgroundColor接口,就表示画布拥有了背景颜色这个功能
当一个接口继承另一个接口,你可以理解为,该接口有了那个接口的功能
这个接口有一个Grapic属性,因为在实现时需要用该对象进行画图。
最后就是验证码IVerifyCode接口了
/// <summary> /// To draw the verify-code. /// </summary> public interface IVerifyCode:IFont,IGraphic { /// <summary> /// Gets the codes that user can be defined by ownself. /// </summary> string VerifyCodeString { get; } /// <summary> /// Gets ot sets the length of code to generate. /// </summary> int Length { get; set; } /// <summary> /// Gets the shapes to draw, you can inherit the ShapeProvider and draw your own shape on the graphic /// </summary> ShapeProvider[] Shapes { get; } /// <summary> /// Gets or sets the final stream that has included verify code that has drewn. /// </summary> System.IO.MemoryStream OutputStream { get; set; } /// <summary> /// Gets the Bitmap /// </summary> System.Drawing.Bitmap VerifyBitmap { get; } /// <summary> /// To draw the verify-code image. /// </summary> void DrawImage(); }
这个接口就是定义给外部进行验证码实现用的。
因此,这个接口继承了IFont和IGraphic接口
里面定义的一些属性,我想朋友们都不陌生。
Shapes这个对象是一个ShapeProvider类数组,该类表示需要画的形状集合,就是开头提到的,弧线,横线等等
OutputStream对象是为了最后将验证码进行输出用的流。
最后定义了一个DrawImage方法,这个方法就是开始让外部使用者进行调用,实现自己的验证码。
好了,一个较为简单的验证码接口架构就差不多了。接下来就是一些实现
- 简单的验证码架构(1)
- 三层架构(MVC)实现简单登陆注册验证(含验证码)
- 简单的验证码
- 简单的验证码
- 简单的验证码
- 简单的验证码
- 简单的验证码
- servlet简单的验证码登录验证
- 验证码1(简单介绍)
- 简单验证码的产生
- 简单验证码的产生
- 简单验证码的产生
- 简单验证码的识别
- 简单的验证码程序
- 简单验证码的产生
- 验证码的简单例子
- 简单的写验证码
- jsp简单的验证码
- ExtractStrings c++builder 字符串分解
- IOS-UIImage保存到iOS照片库和对应程序沙盒中
- ajax全局事件
- IOS 本地通知
- 关于Parent: child process exited with status 3221225477 -- Restarting.(转)
- 简单的验证码架构(1)
- 第二十五讲 实例补充
- RHEL6通过安装光盘或ISO文件制作本地yum源的方法
- session超时
- python操作文件目录
- 身份证号码规则
- Android WebView图片浏览
- 关于android的listview数据列表显示的下拉和刷新报错问题
- cocos2d-x中讲解TileMap地图编辑器的高级用法(三)