软件设计模式
:
1.应对
重复发生
的问题2.
解决方案
3.可以
反复使用
1.
本质
是面向对象
2.优点很多
1.创建型-创建和使用分离
2.结构型-组合
3.行为型-协作
5+7+11=
23种模式
UML
-统一建模语言-Unified Modeling Language
1.
可视化
,图形化
2.各种图(9种图)
3.可以同时表示静态信息、动态信息
类图
-class diagram
就是图形化显式
类
className,field,method
+public,-private,#protected
关联关系
:
单向
关联:
field:type 成员变量:address 其属性 :Address (Address 是一个类) 关联关系 is
最常用的,类与类之间的关系
注意,单项关联有一个箭头
实线+箭头
双向
关联:
各自持有,对方的类,来当作自己的成员变量,
注意,双向关联没有箭头
自
关联:
聚合关系
:
1.整体、成员(也叫部分)
2.成员(部分)
可
独立存在注意,
聚合
关系用菱形表示,不是箭头,而且是空心菱
形
组合关系
:
1.整体、成员(也叫部分)
2.成员(部分)
不
能独立存在注意,
组合
关系用菱形表示,不是箭头,是实心菱
形
依赖关系
:
1.耦合度最弱,
2.临时性的关系(不是整体和部分它们之间那样的关系)
3.
虚线
+箭头
指向,被使用的类
继承关系
:
1.耦合度最强,
2.父子关系
3.实线空心三角形
4.指向父类
注意,继承关系使用
实线
+空心三角
形
实现关系
:
1.接口、实现类
2.实现关系使用虚线空心三角形
3.指向接口
注意,实现关系使用
虚线
+空心三角
形
单例模式
单例,使用一个内存空间,
private static LazySingleton instance;
LazySingleton 是类型,
instance 是成员变量,
相当于,private static string color;
成员变量的类型写在成员变量前面并用空格连接它们,
注意,懒汉式单例模式,在加载类的时候,并没有单例生成,
只有在第一次调用getInstance()方法的时候,才会创建单例对象,
单例对象代码,如下:
使用测试类Test1验证在多次调用后,产生的是否为单例对象(即是否是同一个对象),代码如下:
测试结果,如下:
内存地址相同,都是4554617c,说明这4个实例就是同一个实例,即单例实例
注意,饿汉单例模式,在类创建的同时,就会同步建立一个静态的单例对象,之后也不会再作改变。
饿汉式代码,如下:
注意,使用final修饰的变量 ,表示其内存地址就已经固定了,不会再发生改变
测试在多次调用后,产生的实例是否是同一个实例,测试代码如下:
测试结果如下:
显然是同一个内存地址,说明再经过了3次调用,每次都得到同一个实例,即同一个单例
枚举类型,创建单例代码,如下:
注意,这里创建SingletonEnum类之前要手工选择Java中的enum代码,如下:
测试类代码如下:
测试结果,如下:
说明是同一个单例,
使用Runtime的单例对象获取Java虚拟机的内存总量、最大内存,代码如下:
用Runtime的单例对象执行Windows命令的代码如下:
运行结果如下:
实现上述两个功能,完整代码,如下:
注意,主方法上有一个抛出异常的代码,
把执行ipconfig的结果存放到process变量里,
用getInputStream方法将变量process中的数据转成流数据放到变量inputStream中,
准备一个100兆空间大小的字节类型的变量arr,
把变量inputStream中的流数据通过read方法存放到字节变量 arr中,
把b个字节数据转成gbk码的字符串,
当通过Runtime执行像ipconfig这样的命令时,
命令的输出会被重定向到操作系统的一个进程间通信(IPC)通道,
这个通道我们不能直接以文本形式访问。
为了能够读取和处理这些输出,我们需要通过特定的流接口来访问这些数据。
Process类的getInputStream()方法就是用来获取这样一个InputStream对象的。
这个InputStream代表了子进程的标准输出流。
简单来说,命令的输出在操作系统层面是以字节流的形式存在的,
而InputStream正是Java中处理字节流的标准方式。
通过将进程的输出流转换为InputStream,
我们可以利用Java的I/O流库来读取、解析这些原始的字节数据,进而转换成我们能够理解和处理的格式,比如字符串。
September2024the27thFriday