策略模式,工厂模式,单例模式编写身份证的验证算法

策略模式:它定义算法家族,分别封装起来,让他们之间互相替换,此模式让算法的变化,不会影响使用算法的客户。



1
/// <summary> 2 /// 策略模式 3 /// </summary> 4 public interface IidCheck 5 { 6 bool Check(string id); 7 } 8 9 public class Id18Check : IidCheck 10 { 11 public bool Check(string cid) 12 { 13 string[] aCity = new string[] { null, null, null, null, null, null, null, null, null, null, null, "北京", "天津", "河北", "山西", "内蒙古", null, null, null, null, null, "辽宁", "吉林", "黑龙江", null, null, null, null, null, null, null, "上海", "江苏", "浙江", "安微", "福建", "江西", "山东", null, null, null, "河南", "湖北", "湖南", "广东", "广西", "海南", null, null, null, "重庆", "四川", "贵州", "云南", "西藏", null, null, null, null, null, null, "陕西", "甘肃", "青海", "宁夏", "新疆", null, null, null, null, null, "台湾", null, null, null, null, null, null, null, null, null, "香港", "澳门", null, null, null, null, null, null, null, null, "国外" }; 14 double iSum = 0; 15 System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{17}(\d|X|x)$"); 16 System.Text.RegularExpressions.Match mc = rg.Match(cid); 17 if (!mc.Success) 18 { 19 //Log.WriteLog("身份证验证失败:" + cid); 20 return false; 21 } 22 cid = cid.ToLower(); 23 cid = cid.Replace("x", "a"); 24 if (aCity[int.Parse(cid.Substring(0, 2))] == null) 25 { 26 //Log.WriteLog("身份证验证失败:" + cid); 27 //非法地区 28 return false; 29 } 30 try 31 { 32 DateTime.Parse(cid.Substring(6, 4) + "-" + cid.Substring(10, 2) + "-" + cid.Substring(12, 2)); 33 } 34 catch 35 { 36 //Log.WriteLog("身份证验证失败:" + cid); 37 return false;//非法生日 38 } 39 for (int i = 17; i > 0; i--) 40 { 41 int w = (int)(System.Math.Pow(2, i) % 11); 42 int a = int.Parse(cid[17 - i].ToString(), System.Globalization.NumberStyles.HexNumber); 43 44 iSum += w * a; 45 } 46 47 Dictionary<string, string> dic = new Dictionary<string, string>(); 48 dic.Add("0", "1"); 49 dic.Add("1", "0"); 50 dic.Add("2", "X"); 51 dic.Add("3", "9"); 52 dic.Add("4", "8"); 53 dic.Add("5", "7"); 54 dic.Add("6", "6"); 55 dic.Add("7", "5"); 56 dic.Add("8", "4"); 57 dic.Add("9", "3"); 58 dic.Add("10", "2"); 59 60 if (dic[(iSum % 11).ToString()] == cid.Substring(cid.Length - 1, 1)) 61 { 62 return true; 63 } 64 return false; 65 } 66 } 67 68 public class Id15Check : IidCheck 69 { 70 public bool Check(string cid) 71 { 72 string[] aCity15 = new string[] { null, null, null, null, null, null, null, null, null, null, null, "北京", "天津", "河北", "山西", "内蒙古", null, null, null, null, null, "辽宁", "吉林", "黑龙江", null, null, null, null, null, null, null, "上海", "江苏", "浙江", "安微", "福建", "江西", "山东", null, null, null, "河南", "湖北", "湖南", "广东", "广西", "海南", null, null, null, "重庆", "四川", "贵州", "云南", "西藏", null, null, null, null, null, null, "陕西", "甘肃", "青海", "宁夏", "新疆", null, null, null, null, null, "台湾", null, null, null, null, null, null, null, null, null, "香港", "澳门", null, null, null, null, null, null, null, null, "国外" }; 73 74 System.Text.RegularExpressions.Regex rg15 = new System.Text.RegularExpressions.Regex(@"^\d{15}$"); 75 System.Text.RegularExpressions.Match mc15 = rg15.Match(cid); 76 if (!mc15.Success) 77 { 78 return false; 79 } 80 cid = cid.ToLower(); 81 cid = cid.Replace("x", "a"); 82 if (int.Parse(cid.Substring(0, 2)) > aCity15.Length) 83 { 84 //Log.WriteLog("身份证验证失败:" + cid); 85 return false;//非法地区 86 } 87 if (aCity15[int.Parse(cid.Substring(0, 2))] == null) 88 { 89 //Log.WriteLog("身份证验证失败:" + cid); 90 return false;//非法地区 91 } 92 try 93 { 94 DateTime.Parse("19" + cid.Substring(6, 2) + "-" + cid.Substring(8, 2) + "-" + cid.Substring(10, 2)); 95 } 96 catch 97 { 98 //Log.WriteLog("身份证验证失败:" + cid); 99 return false;//非法生日 100 } 101 return true; 102 } 103 } 104 105 /// <summary> 106 /// 工厂模式 107 /// </summary> 108 public class IdCheckFactory 109 {
       private
IdCheckFactory(){}
110         /// <summary>
111         /// 单例模式
112         /// </summary>
113         public static readonly IdCheckFactory Instance = new IdCheckFactory();
114 
115         public bool Check(string id)
116         {
117             if (string.IsNullOrEmpty(id))
118             {
119                 return false;
120             }
121 
122             switch (id.Length)
123             {
124                 case 15:
125                     IidCheck model = new Id15Check();
126                     return model.Check(id);
127                 case 18:
128                     IidCheck model18 = new Id18Check();
129                     return model18.Check(id);
130                 default:
131                     return false;
132             }
133         }
134     }


调用控制台代码:
 1  /// <summary>
 2     /// client端
 3     /// </summary>
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             Console.WriteLine("请输入要验证的身份证号");
 9             string id = Console.ReadLine();
10             while (id != "#")
11             {
12                 bool succ = IdCheckFactory.Instance.Check(id);
13 
14                 if (succ)
15                 {
16                     Console.WriteLine("身份证输入正确");
17                 }
18                 else
19                 {
20                     Console.WriteLine("身份证输入错误");
21                 }
22                 Console.WriteLine("请输入要验证的身份证号");
23                 id = Console.ReadLine();
24             }
25 
26         }
27     }

 



 

转载于:https://www.cnblogs.com/suzixuan/p/6282290.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql引擎模式_mysql引擎,完整的见表语句,数据库模式, 常用数据类型,约束条件...

引擎show engines : 查看引擎innodb(默认引擎)&#xff1a;支持事务&#xff0c;行级锁&#xff0c;外键myisam:查询效率由于innodb,不需要支持事务&#xff0c;行级锁&#xff0c;外键&#xff0c;可以选用myisam来优化数据库mysql> create table t1(id int)engineinnodb;m…

testng连接MySQL_Selenium+TestNG实战-8-连接数据库方法去验证文章是否发布

原标题&#xff1a;SeleniumTestNG实战-8-连接数据库方法去验证文章是否发布记得之前群里&#xff0c;有人说举例一下连接数据库在Selenium自动化测试中的应用。本篇刚好来举例一个&#xff0c;前面我们都是通过发布后文章的详情页的标题来判断文章是否已经发布成功&#xff0c…

凸包 poj 1113

求一个多边形 拐弯的地方用圆弧补上 距离>l 求他的周长 求一个凸包的周长 加2*pi*l #include<stdio.h> #include<string.h> #include<algorithm> #include<vector> #include<stack> #include<math.h> using namespace std;#define MA…

武汉mysql ocp考点_MySQL OCP考试复习系列–开篇:了解MySQL考试

MySQL OCP考试复习系列–开篇&#xff1a;了解MySQL考试嗯&#xff0c;那个决定去考MySQL OCP了&#xff0c;事实上最近工作一直围绕着DB2&#xff0c;MySQL要去考的话需要好好的复习的啊。150分钟&#xff0c;100道多选&#xff0c;答对60道题可以通过&#xff0c;费用1077。L…

java文件服务器_JavaWeb项目架构之NFS文件服务器

NFS简介NFS(Network File System)即网络文件系统。主要功能&#xff1a;通过网络(局域网)让不同的主机系统之间可以共享文件或目录。主要用途&#xff1a;NFS网络文件系统一般被用来存储共享视频&#xff0c;图片&#xff0c;附件等静态资源文件。NFS存储服务无NFS文件共享存储…

【bzoj】3224: Tyvj 1728 普通平衡树

3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 10097 Solved: 4302[Submit][Status][Discuss]Description 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a…

java 修改 referer_看好你的门-客户端传数据-用java修改referer

1、简单说明Referer、origin用来表明&#xff0c;浏览器向WEB服务器表明自己来自哪里。但是就它本身而言&#xff0c;并非完全安全。写一个例子&#xff0c;可以任意修改http信息头中的referer、origin2、准备&#xff1a;用httpClient4.0来具体实现3、Java修改http信息头refer…

table 样式详解

1.table 中css样式控制border 只能控制外边框&#xff0c;内边框需要写<table border"1"> 2.table 会自动撑大&#xff0c;即使td 设置了 width和height这与div 是不同的 3.只有一个table的时候 &#xff0c;高度自适应全屏 <style type"text/css"…

libsvm java 实例_LibSVM Java API调用示例程序

【实例简介】LibSVM Java API调用示例程序Eclipse 完整工程可以运行相关详情见http://blog.csdn.net/yangliuy/article/details/8041343#comments3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例欢迎关注我的博客blog.csdn.net/yangliuy【实例截图】【核心代码】326…

关于H3 BPM数据库如何实现排序取数据的问题

问题&#xff1a; 在打印模板中获取子表内容&#xff0c;可从数据库中取数据&#xff0c;而当前项目数据库里面数据按年度录入&#xff0c;但是只需要显示近3年的数据&#xff0c;插件如何实现排序取数据&#xff1f; 解决方法&#xff1a; 1、先直接写一个SQL语句&#xff0c;…

java 将pdf转换成word_java如何实现pdf转word?

Atitit pdf转文本 pdfutiljava -jar C:\Users\attilax\Pictures\pdfbox-app-2.0.9.jar ExtractText "C:\atibeks517\l4 doc v3 r7a ori exted\_0index\一种简单的基于字符形状的验证码识别技术.pdf" c:\logs\识别技术.pdf.txt转html-consolefalseSend text to consol…

spring整合

spring整合hibernate&#xff0c;整合什么&#xff1f; 1. Spring 整合 Hibernate 整合什么 ?1). 有 IOC 容器来管理 Hibernate 的 SessionFactory 2). 让 Hibernate 使用上 Spring 的声明式事务2. 整合步骤:1). 加入 hibernate ①. jar 包 ②. 添加 hibernate 的配置文件: hi…

java 进程不关闭_java运行程序关不了窗口

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package office菜单;import java.awt.Frame;import java.awt.Menu; //菜单组件import java.awt.MenuBar; //菜单条组件import java.awt.MenuItem; //菜单项组件public class frameTest {public static void main(String[] args) {f…

看看大货车到底有多少盲区,肯定用得到!救命的!

上路的司机都知道&#xff0c;一旦看到大货车就要离它远远的&#xff0c;因为大货车的盲区大。可是又有多少轿车司机懂得盲区在哪里呢?不仅是轿车司机&#xff0c;许多行人和非机动车辆对于大货车的盲区也是一知半解&#xff0c;常常有人因此丧命。 行人篇 先给大家看一张最直…

msgpack java lua_使用lua-cmsgpack序列化和反序列化lua对象

原文在简书首发&#xff1a;http://www.jianshu.com/p/badf412db4e7lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库&#xff0c;没有任何其它依赖&#xff0c;编译后可以直接被lua调用&#xff0c;目前主要支持Lua5.1/5.2/5.3 版本。1、什么是MessagePack&#xff1f;-…

Oracle-11g 基于 NBU 的 rman 冷备份及恢复

备份恢复环境&#xff1a; (1).源端&#xff1a;SUSE Enterprise Linux 11Oracle 11g 11.2.0.3.6&#xff08;RAC&#xff09;(2).目标端&#xff1a;SUSE Enterprise Linux 11Oracle 11g 11.2.0.3.6&#xff08;RAC&#xff09;冷备份及恢复情形&#xff1a;冷备份 odsdb 集群…

全国250米DEM数据

全国250米DEM数据 DEM是数字高程模型的英文简称(Digital Elevation Model)&#xff0c;是研究分析地形、流域、地物识别的重要原始资料。由于DEM 数据能够反映一定分辨率的局部地形特征&#xff0c;因此通过DEM 可提取大量的地表形态信息&#xff0c;可用于绘制等高线、坡度图、…

redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解

jedis是一个著名的key-value存储系统&#xff0c;而作为其官方推荐的java版客户端jedis也非常强大和稳定&#xff0c;支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比&#xff1a;一、普通同步方式最简单和基础…

【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp

题目描述 最近&#xff0c;Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是&#xff0c;她们要求FJ把那些老旧的电话线换成性能更好的新电话线。 新的电话线架设在已有的N(2 < N < 100,000)根电话线杆上&#xff0c; 第i根电话线杆的高度为height_i米(1 &…

Loadrunner进行HTTPS协议性能测试

1.最简单办法就是在脚本前面加上&#xff1a;web_set_sockets_option("SSL_VERSION","TLS")&#xff0c;一般能解决HTTPS协议的请求问题&#xff0c;无毒无公害&#xff0c;快速还能解决问题 2.其实对于HTTP跟HTTPS&#xff0c;只是在服务器端配置到底是走…