Java 23种设计模式

2023-05-25编程技术8684

转自: http://zz563143188.iteye.com/blog/1847029

; i<count; i++){
list.add(new MailSender());
}
}
public void produceSmsSender(int count){
for(int i=0; i<count; i++){
list.add(new SmsSender());
}
}
}

测试类:

[java] view plaincopy

    public class Test {
    public static void main(String[] args) {
    Builder builder = new Builder();
    builder.produceMailSender(10);
    }
    }

从这点看出,建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。所以与工程模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。因此,是选择工厂模式还是建造者模式,依实际情况而定。

;
private static ConnectionPool instance = null;
Connection conn = null;
/*构造方法,做一些初始化工作*/
private ConnectionPool() {
pool = new Vector<Connection>(poolSize);
for (int i = 0; i < poolSize; i++) {
try {
Class.forName(driverClassName);
conn = DriverManager.getConnection(url, username, password);
pool.add(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/* 返回连接到连接池 */
public synchronized void release() {
pool.add(conn);
}
/* 返回连接池中的一个数据库连接 */
public synchronized Connection getConnection() {
if (pool.size() > 0) {
Connection conn = pool.get(0);
pool.remove(conn);
return conn;
} else {
return null;
}
}
}

 
通过连接池的管理,实现了数据库连接的共享,不需要每一次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!本章讲解了7种结构型模式,因为篇幅的问题,剩下的11种行为型模式,

本章是关于设计模式的最后一讲,会讲到第三种设计模式——行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。这段时间一直在写关于设计模式的东西,终于写到一半了,写博文是个很费时间的东西,因为我得为读者负责,不论是图还是代码还是表述,都希望能尽量写清楚,以便读者理解,我想不论是我还是读者,都希望看到高质量的博文出来,从我本人出发,我会一直坚持下去,不断更新,源源动力来自于读者朋友们的不断支持,我会尽自己的努力,写好每一篇文章!希望大家能不断给出意见和建议,共同打造完美的博文!

 

 

先来张图,看看这11中模式的关系:

第一类:通过父类与子类的关系进行实现。第二类:两个类之间。第三类:类的状态。第四类:通过中间类

];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}

三个实现类:

[java] view plaincopy

    public class Plus extends AbstractCalculator implements ICalculator {
    @Override
    public int calculate(String exp) {
    int arrayInt[] = split(exp,"\\+");
    return arrayInt[0]+arrayInt[1];
    }
    }

[java] view plaincopy

    public class Minus extends AbstractCalculator implements ICalculator {
    @Override
    public int calculate(String exp) {
    int arrayInt[] = split(exp,"-");
    return arrayInt[0]-arrayInt[1];
    }
    }

[java] view plaincopy

    public class Multiply extends AbstractCalculator implements ICalculator {
    @Override
    public int calculate(String exp) {
    int arrayInt[] = split(exp,"\\*");
    return arrayInt[0]*arrayInt[1];
    }
    }

简单的测试类:

[java] view plaincopy

    public class StrategyTest {
    public static void main(String[] args) {
    String exp = "2+8";
    ICalculator cal = new Plus();
    int result = cal.calculate(exp);
    System.out.println(result);
    }
    }

输出:10

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

],array[1]);
}
/*被子类重写的方法*/
abstract public int calculate(int num1,int num2);
public int[] split(String exp,String opt){
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}

[java] view plaincopy

    public class Plus extends AbstractCalculator {
    @Override
    public int calculate(int num1,int num2) {
    return num1 + num2;
    }
    }

测试类:

[java] view plaincopy

    public class StrategyTest {
    public static void main(String[] args) {
    String exp = "8+8";
    AbstractCalculator cal = new Plus();
    int result = cal.calculate(exp, "\\+");
    System.out.println(result);
    }
    }

我跟踪下这个小程序的执行过程:首先将exp和"\\+"做参数,调用AbstractCalculator类里的calculate(String,String)方法,在calculate(String,String)里调用同类的split(),之后再调用calculate(int ,int)方法,从这个方法进入到子类中,执行完return num1 + num2后,将值返回到AbstractCalculator类,赋给result,打印出来。正好验证了我们开头的思路。

;
public MyIterator(Collection collection){
this.collection = collection;
}
@Override
public Object previous() {
if(pos > 0){
pos--;
}
return collection.get(pos);
}
@Override
public Object next() {
if(pos<collection.size()-1){
pos++;
}
return collection.get(pos);
}
@Override
public boolean hasNext() {
if(pos<collection.size()-1){
return true;
}else{
return false;
}
}
@Override
public Object first() {
pos = 0;
return collection.get(pos);
}
}

测试类:

[java] view plaincopy

    public class Test {
    public static void main(String[] args) {
    Collection collection = new MyCollection();
    Iterator it = collection.iterator();
    while(it.hasNext()){
    System.out.println(it.next());
    }
    }
    }

输出:A B C D E

此处我们貌似模拟了一个集合类的过程,感觉是不是很爽?其实JDK中各个类也都是这些基本的东西,加一些设计模式,再加一些优化放到一起的,只要我们把这些东西学会了,掌握好了,我们也可以写出自己的集合类,甚至框架!

, 2)), 8)));
System.out.println(result);
}
}

最后输出正确的结果:3。

基本就这样,解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等!

设计模式基本就这么大概讲完了,总体感觉有点简略,的确,这么点儿篇幅,不足以对整个23种设计模式做全面的阐述,此处读者可将它作为一个理论基础去学习,通过这四篇博文,先基本有个概念,虽然我讲的有些简单,但基本都能说明问题及他们的特点,如果对哪一个感兴趣,可以继续深入研究!同时我也会不断更新,尽量补全遗漏、修正不足,欢迎广大读者及时提出好的建议,我们一起学习!项目中涉及到的代码,已经放到了我的资源里:http://download.csdn.net/detail/zhangerqing/4835830(因为我不喜欢不劳而获,所以没有免积分,只设置了5个,如果有人实在没积分又急要,那么联系我吧,我给你发过去)。

Java 23种设计模式的相关教程结束。

本文地址:https://www.ufcn.cn/tutorials/2671467.html

如非特殊说明,本站内容均来自于网友自主分享,概不代表本站观点,如有任何问题我们都将在收到反馈后的第一时间进行处理!

  • Springboot下使用Redis管道(pipeline)进行批量操作的介绍
    08月142023

    今天小编给大家分享的是Springboot下使用Redis管道(pipeline)进行批量操作的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。前言之前有业务场景需要批量插入数据到Redis中,做的过程中也有一些感悟,因此记录下来,以防忘记。下面的内容会涉及到分别使用for、管道处理批量操作,比较其所花费时间。分别使用RedisCallb...

  • 关于C++和OpenMP的介绍
    08月142023

    今天小编给大家分享的是关于C++和OpenMP的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。一、背景知识1、program作用#pragma是C和C++语言中的一个预处理指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma通常与编译器特定的选项或功能一起使用,因此它的具体行为和实现可能因不同的编译器而有所不...

  • C语言结构体指针具体怎么使用
    08月142023

    本篇文章和大家了解一下C语言结构体指针具体怎么使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在C语言中,结构体指针是一种非常有用的数据类型,它可以让我们更方便地操作结构体。结构体指针可以指向结构体的实例,从而允许我们访问结构体中的成员变量,并对这些成员变量进行赋值、修改、删除等操作。本文将介绍C语言中结构体指针的基础概念和使用方法,并提供一些示例代码来帮助读者更好地理解。什...

  • JavaScript作用域从局部到全局介绍
    08月142023

    本篇文章和大家了解一下JavaScript作用域从局部到全局介绍。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。JavaScript作用域深度剖析:从局部到全局一网打尽1.1编译原理JavaScript 事实上是一门编译语言。在传统编译语言中,一段源代码执行前会经历三个步骤:分词/词法分析(Tokenizing/Lexing)var a =&nbsp...

  • C#中如何限制TextBox控件内输入值的范围
    08月082023

    这篇文章主要介绍了C#中如何限制TextBox控件内输入值的范围,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#限制TextBox控件内输入值的范围举个例子C#TextBox控件限制只允许输入数字及小数点处理只输入数字的C#文本框只能输入数字和退格键总结C#限制TextBox控件内输入值的范围 举个例子 比如要限制TextBox1控件内只能输入1~100的...

  • C#如何让winform程序中的输入文本框保留上次的输入
    08月082023

    这篇文章主要介绍了C#如何让winform程序中的输入文本框保留上次的输入问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#让winform程序中的输入文本框保留上次的输入C#TextBox控件,回车键实现点击按钮即自动登录摘要总结C#让winform程序中的输入文本框保留上次的输入 选中TextBox控件,在属性窗格中找到(ApplicationSet...

  • C# 获取XML文件内容的多种方式总结
    08月082023

    这篇文章主要介绍了C# 获取XML文件内容的多种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#获取XML文件内容的方式一、读取外部的XML文件方法二、读取内部XML文件方法三、读取类库中XML文件的方法四、读取程序内添加的外部可见的XML文件总结C#获取XML文件内容的方式 首先设定有一个xml文件Configs.xml,其内容如下: ...

  • C# Path类---文件路径解读
    08月082023

    这篇文章主要介绍了C# Path类---文件路径,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#Path类—文件路径C#文件路径Path类测试总结C#Path类—文件路径 给定如下字符串类型filePath,表示一个文件路径: stringfilePath="D:\\Program\\Test\\Config.txt"; ...

  • C#如何判断.Net Framework版本是否满足软件运行需要的版本
    08月082023

    这篇文章主要介绍了C#如何判断.Net Framework版本是否满足软件运行需要的版本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录判断.NetFramework版本是否满足软件运行需要的版本老的方法,支持2.0及以上最后将判断的代码放在Main方法里总结判断.NetFramework版本是否满足软件运行需要的版本 不直接运行软件,而是运行一个引导程序...

  • c#判断代码是否执行超时的几种方式总结
    08月082023

    这篇文章主要介绍了c#判断代码是否执行超时的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录c#判断代码是否执行超时一、使用委托二、使用Task三、使用Timer四、使用Thread总结c#判断代码是否执行超时 一、使用委托 delegatevoiddg(); dgdgCase; voidmethod() {    dgCase=()=>  ...