例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. 借鉴Elasticsearch 7.x 深入系列学习

    开始 Elasticsearch 深入系列目录如下: Elasticsearch 7.x 深入 数据准备 Elasticsearch 7.x 深入[1]索引[一]原理 Elasticsearch 7. ...

  2. C++并发与多线程学习笔记--async、future、packaged_task、promise

    async future packaged_task promise async std:async 是个函数,用来启动一个异步任务,启动起来一个异步任务之后,返回一个std::futre对象,启动一 ...

  3. 快速排序(QuickSort)Java版

    快速排序 快速排序是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 ...

  4. 北航OO第二单元作业总结(2.1~2.3)

    在经过第一单元初步认识面向对象编程思想后,本蒟蒻开始了第二单元--多线程部分的学习.本单元的作业是构造符合条件的"目的选层电梯"模型,自行设计调度算法,进行合理调度,完成所有乘客的 ...

  5. OO第四单元总结 and 学期总结

    第四次单元总结 本单元架构设计总结 第一次作业:类图解析 本次作业仅仅需要实现官方的UmlInteraction接口,通过反射机制在Runner中实例化一个我们实现的类,来进行类图元素的分类解析,从而 ...

  6. python基础(补充):lambda匿名函数,用了的,都说好!

    lambda函数又叫做"匿名函数".当你完成一件小工作时,直接使用该函数可以让你的工作得心应手. lambda函数介绍 在Python中,定义函数使用的是def关键字,但是通过la ...

  7. Android平台OpenGL ES/Assimp/OpenCV/GLM集成说明

    Android平台OpenGL ES/Assimp/OpenCV/GLM集成说明 本文代码见: https://github.com/jiangxincode/OpenGLDemo 集成Assimp ...

  8. 2021S软件工程——个人阅读作业2

    2021S软件工程--个人阅读作业2 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任建) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 了解并熟悉软件开发的具体流程, ...

  9. wordpress current_user_can 判断角色

    current_user_can 使用说明: current_user_can( $capability, $args ); $capability参数是必须的,是指给予什么样的能力,或者说给他可以做 ...

  10. 过 DNF TP 驱动保护(二)

    过 DNF TP 驱动保护(二)   文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...