例1 字符串操作

定义一个StringBuffer类对象,然后通过append()方法向对象中添加26个小写字母,每次只添加一次,共添加26次,然后按逆序方式输出,并且可以删除前5个字符

  • 面向过程实现

 1 public class TestDemo {
2 public static void main(String[] args) throws Exception{
3 StringBuffer buffer = new StringBuffer();
4 for(int x = 'a' ; x <= 'z' ; x++) {
5 buffer.append((char)x);
6 }
7 System.out.println("[初始化数据]" + buffer);
8 System.out.println("[逆序输出]" + buffer.reverse());
9 System.out.println("[删除前五个字符]" + buffer.delete(0, 5));
10 }
11 }
  • 面向对象实现(接口先行--子类实现--工厂解耦)

 1 interface IContent{
2 public String content();
3 public String reverse();
4 public String delete(int index);
5 }
6 class StringContent implements IContent{
7 private StringBuffer buffer = new StringBuffer();
8 public StringContent() {
9 for(int x = 'a' ; x <= 'z' ; x++) {
10 buffer.append((char)x);
11 }
12 }
13 @Override
14 public String content() {
15 return this.buffer.toString();
16 }
17 @Override
18 public String reverse() {
19 return this.buffer.reverse().toString();
20 }
21 @Override
22 public String delete(int index) {
23 return this.buffer.delete(0, index).toString();
24 }
25 }
26 class Factory{
27 private Factory() {}
28 public static IContent getInstance() {
29 return new StringContent();
30 }
31 }
32 public class TestDemo {
33 public static void main(String[] args) throws Exception{
34 IContent content = Factory.getInstance();
35 System.out.println("[初始化数据]" + content.content());
36 System.out.println("[逆序输出]" + content.reverse());
37 System.out.println("[删除前五个字符]" + content.delete(5));
38 }
39 }

  • 先定义出公共处理标准,随后依据此标准进行项目的具体实现
  • 对于接口子类的获取采用工厂模式

例2 生成随机数

利用Random类产生5个1~30之间(包括1和30)的随机整数

  • 接口:描述最终目的
  • 异常类:继承RuntimeException,业务异常,不希望此异常直接出现在方法的定义声明处(如果继承Exception会强制处理)

 1 package javaSE;
2
3 import java.util.Arrays;
4 import java.util.Random;
5
6 interface INumber{
7 public int[] getData();
8 }
9 class InvalidArrayLengthException extends RuntimeException{
10 public InvalidArrayLengthException() {}
11 public InvalidArrayLengthException(String str) {
12 super(str);
13 }
14 }
15 class RandomNumber implements INumber{
16 private int data[];
17 public RandomNumber() {
18 this(3);
19 }
20 public RandomNumber(int len) {
21 if(len <= 0) {
22 throw new InvalidArrayLengthException("数组长度不正确!");
23 }
24 this.data = new int[len];
25 this.createRandom();
26 }
27 public void createRandom() {
28 Random random = new Random();
29 for(int x = 0 ; x < this.data.length; x++) {
30 this.data[x] = random.nextInt(30) + 1;
31 }
32 }
33 @Override
34 public int[] getData() {
35 return this.data;
36 }
37 }
38 class Factory{
39 private Factory() {}
40 public static INumber getInstance(int ...args) {
41 if(args.length == 0) {
42 return new RandomNumber();
43 }else {
44 return new RandomNumber(args[0]);
45 }
46 }
47 }
48 public class TestDemo {
49 public static void main(String[] args) throws Exception{
50 INumber content = Factory.getInstance(5);
51 System.out.println(Arrays.toString(content.getData()));
52 }
53 }

例3 Email验证

输入一个Email地址,用正则表达式验证该Email是否正确

 1 import java.util.Arrays;
2 import java.util.Random;
3
4 interface IValidator{
5 public boolean test() ;
6 }
7 class EmailValidator implements IValidator{
8 public static final String DEFAULT_EMAIL_REGEX = "\\w+@\\w+\\.\\w+";
9 private String regex;
10 private String content;
11 public EmailValidator(String content) {
12 this(content,DEFAULT_EMAIL_REGEX);
13 this.content = content;
14 this.regex = DEFAULT_EMAIL_REGEX;
15 }
16 public EmailValidator(String content,String regex) {
17 this.content = content;
18 this.regex = regex;
19 }
20 @Override
21 public boolean test() {
22 if(this.content == null || "".equals(this.content)) {
23 return false;
24 }
25 return this.content.matches(this.regex);
26 }
27 }
28 class Factory{
29 private Factory() {}
30 public static IValidator getInstance(String content,String ...regex) {
31 if(regex.length == 0) {
32 return new EmailValidator(content);
33 }else {
34 return new EmailValidator(content,regex[0]);
35 }
36 }
37 }
38 public class TestDemo {
39 public static void main(String[] args) throws Exception{
40 {IValidator validator = Factory.getInstance("muyan@yootk.com");
41 System.out.println(validator.test() ? "验证通过":"Email数据输入错误");}
42 {IValidator validator = Factory.getInstance("muyan@yootk.org",
43 "[a-zA-Z][a-zA-Z0-9_\\-\\.]+@\\w+\\.(com|com\\.cn|net\\.cn|gov|edu|org)");
44 System.out.println(validator.test() ? "验证通过":"Email数据输入错误");}
45 }
46 }
  • 即可使用默认的正则表达式,也可根据需要扩充

例4 IP地址验证

编写正则表达式,判断给定的IP地址是否合法

 1 interface IValidator{
2 public boolean test() ;
3 }
4 class IPHostValidator implements IValidator{
5 public static final String DEFAULT_EMAIL_REGEX = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
6 private String regex;
7 private String content;
8 public IPHostValidator(String content) {
9 this(content, DEFAULT_EMAIL_REGEX);
10 }
11 public IPHostValidator(String content,String regex) {
12 this.content = content;
13 this.regex = regex;
14 }
15 @Override
16 public boolean test() {
17 if(this.content == null || "".equals(this.content)) {
18 return false;
19 }
20 if("0.0.0.0".equals(this.content)||"255.255.255.255".equals(this.content)) {
21 return false;
22 }
23 return this.content.matches(this.regex);
24 }
25 }
26 class Factory{
27 private Factory() {}
28 public static IValidator getInstance(String content,String ...regex) {
29 if(regex.length == 0) {
30 return new IPHostValidator(content);
31 }else {
32 return new IPHostValidator(content,regex[0]);
33 }
34 }
35 }
36 public class TestDemo {
37 public static void main(String[] args) throws Exception{
38 IValidator validator = Factory.getInstance("192.168.1.2");
39 System.out.println(validator.test() ? "验证通过":"IP数据输入错误");
40 }
41 }
  • 实际开发中除了核心代码,最常见的就是数据验证功能

例5 HTML拆分

给定一段HTML代码:“<font face="Arial,Serif" size="+2" color="red">”,拆分为

face=Arial,Serif

size=+2

color=red

 1 import java.util.regex.Matcher;
2 import java.util.regex.Pattern;
3
4 interface IStringHandle{
5 public String[] split();
6 }
7 class HTMLStringHandle implements IStringHandle{
8 private String content;
9 private String regex;
10 public HTMLStringHandle(String content,String regex) {
11 this.content = content;
12 this.regex = regex;
13 }
14 @Override
15 public String[] split() {
16 Matcher matcher = Pattern.compile(this.regex).matcher(this.content);
17 StringBuffer buffer = new StringBuffer(this.content.length());
18 while(matcher.find()) {
19 String value = matcher.group(0);
20 String temp[] = value.split("=");
21 buffer.append(temp[0]).append(":").append(temp[1].replaceAll("\"","")).append("|");
22 }
23 return buffer.toString().split("\\|");
24 }
25 }
26 class Factory{
27 private Factory() {}
28 public static IStringHandle getInstance(String content,String regex) {
29 return new HTMLStringHandle(content,regex);
30 }
31 }
32 public class TestDemo {
33 public static void main(String[] args) throws Exception{
34 String html = "<font face=\"Arial,Serif\" size=\"+2\" color=\"red\">";
35 String regex = "\\w+=\"[a-zA-Z0-9,\\+]+\"";
36 IStringHandle handle = Factory.getInstance(html, regex);
37 String result[] = handle.split();
38 for(String temp:result) {
39 System.out.println(temp);
40 }
41 }
42 }

  • 可使用HTMLParser+XPath

例6 国际化应用

从命令行输入国家代号,1代表中国,2代表美国,然后根据不同代号调用不同的资源文件显示信息

  • 编写资源文件
  • 加载资源文件
  • 通过IMessage接口,根据key获取数据

 1 import java.util.Locale;
2 import java.util.ResourceBundle;
3
4 interface IMessage{
5 public String get(String key);
6 }
7
8 class ResourceMessage implements IMessage{
9 private static final String BASE_NAME = "Message";
10 private ResourceBundle resourceBundle;
11 public ResourceMessage(Locale locale){
12 this.resourceBundle = ResourceBundle.getBundle(BASE_NAME,locale);
13 }
14
15 @Override
16 public String get(String key){
17 try{
18 return this.resourceBundle.getString(key);
19 }catch (Exception e){
20 return null;
21 }
22 }
23 }
24
25 class ParameterException extends RuntimeException{
26 public ParameterException(){}
27 public ParameterException(String msg){
28 super(msg);
29 }
30 }
31
32 class Factory{
33 private Factory(){}
34 public static IMessage getInstance(String args[]){
35 if(args.length != 1 || !args[0].matches("\\d")){
36 throw new ParameterException("初始参数配置错误,无法执行");
37 }
38 int select = Integer.parseInt(args[0]);
39 switch (select){
40 case 1:
41 return new ResourceMessage(Locale.CHINESE);
42 case 2:
43 return new ResourceMessage(Locale.US);
44 default:
45 return null;
46 }
47 }
48 }
49
50 public class YootkDemo {
51 public static void main(String[] args) throws Exception{
52 IMessage message = Factory.getInstance(args);
53 System.out.println(message.get("welcome.info"));
54 }
55 }

>> Hello

参考

idea:Maven项目,pom.xml中的resources标签

https://blog.csdn.net/qq_36134376/article/details/90762263

[Java] 类库例题的更多相关文章

  1. Java 类库和常用类库

    Java 类库概念: Java 的应用程序接口 (API) 以包的形式来组织,每个包提供了大量的相关类.接口和异常处理类,这些包的集合就是 Java 的类库 包名以 Java 开始的包是 Java 核 ...

  2. [Liferay6.2]启动Tomcat提示APR不能在java类库路径中被找到的解决办法

    问题描述 启动liferay之后,在控制台中打印出会打印出以下信息: 信息: The APR based Apache Tomcat Native library which allows optim ...

  3. 介绍4款json的java类库 及 其性能测试

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...

  4. 关于ECharts Java类库的一个jquery插件

    在项目中开发图表功能时用到了Echars和一个关于Echars的java类库(http://git.oschina.net/free/ECharts).这个类库主要目的是方便在Java中构造EChar ...

  5. java类库

    Java的应用程序接口(API)以包的形式来组织,每个包提供大量的相关类.接口和异常处理类,这些包的集合就是Java的类库. Java类库可以分为两种 包名以java开始的包是Java核心包(Java ...

  6. Effective Java 第三版——59. 熟悉并使用Java类库

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  7. 词典的实现(3)--使用JAVA类库ArrayList实现Map数据结构

    1,在词典的实现(2)-借助顺序表(数组)实现词典文章中使用了自定义的数组代替ArrayList,并实现了Map数据结构的基本功能.而借助JAVA类库ArrayList类的一些方法可以更加容易地实现M ...

  8. 使用Java类库POI生成简易的Excel报表

    使用Java类库POI生成简易的Excel报表 1.需求 1.数据库生成报表需要转义其中字段的信息.比如 1,有效 2.无效等 2.日期格式的自数据需要转义其格式. 3.标题的格式和数据的格式需要分别 ...

  9. Java类库和常用类库介绍

    Java 类库概念: Java 的应用程序接口 (API) 以包的形式来组织,每个包提供了大量的相关类.接口和异常处理类,这些包的集合就是 Java 的类库 包名以 Java 开始的包是 Java 核 ...

随机推荐

  1. vue中的.sync修饰符用法

    在项目中接触到父组件传值给子组件的时候,想在子组件改变父组件传的值.(比如用于弹窗关闭) 但是正常来说,vue2是不允许子组件直接改父组件传进去的值的. 所以我们需要在子组件内定义自定义事件,通知父组 ...

  2. exec 跟 source 差在哪?-- Shell十三问<第六问>

    exec 跟 source 差在哪?-- Shell十三问<第六问> 这次先让我们从 CU Shell 版的一个实例贴子来谈起吧: 例中的提问是: cd /etc/aa/bb/cc 可以执 ...

  3. 开源一周岁,MindSpore新特性巨量来袭

    摘要:MindSpore很多新特性与大家见面了,无论是在效率提升.易用性,还是创新方面,都是干货满满. 最近,AI计算框架是业界的热点,各大厂商纷纷投身AI框架的自研发,究其原因:AI框架在整个人工智 ...

  4. OOJML系列总结

    目录 0x0 JML理论相关 0.0 概念及作用 0.1 JML语法学习 0x1 使用openJml以及JMLUnitNG 1.0 使用openjml 1.1使用JMLUnitNG 0x2 作业架构设 ...

  5. 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果

    映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...

  6. Go-25-文件管理

    FileInfo接口 package main import ( "fmt" "os" ) // FileInfo 接口文件的信息包括文件名.文件大小.修改权限 ...

  7. 9. VUE 常用正则表达式

    1. 判断输入是否是数字 var numReg = /^[0-9]+$/ var numRe = new RegExp(numReg) if (!numRe.test(number)) { this. ...

  8. 多线程之Lock接口

    之前写了一下synchronized关键字的一点东西,那么除了synchronized可以加锁外,JUC(java.util.concurrent)提供的Lock接口也可以实现加锁解锁的功能. 看完本 ...

  9. Mysql之Mycat读写分离及分库分表

    ## 什么是mycat ```basic 1.一个彻底开源的,面向企业应用开发的大数据库集群 2.支持事务.ACID.可以替代MySQL的加强版数据库 3.一个可以视为MySQL集群的企业级数据库,用 ...

  10. 0704-使用GPU加速_cuda

    0704-使用GPU加速_cuda 目录 一.CPU 和 GPU 数据相互转换 二.使用 GPU 的注意事项 三.设置默认 GPU 四.GPU 之间的切换 pytorch完整教程目录:https:// ...