简单的验证码架构(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方法,这个方法就是开始让外部使用者进行调用,实现自己的验证码。



好了,一个较为简单的验证码接口架构就差不多了。接下来就是一些实现

0 0
原创粉丝点击