@@ -2750,24 +2750,24 @@ Cloneable 接口是一个标识性接口,即该接口不包含任何方法(
27502750
27512751### Objects
27522752
2753- * Objects类与Object是继承关系 。
2753+ Objects 类与 Object 是继承关系 。
27542754
2755- * Objects的方法:
2756-
2757- * `public static boolean equals(Object a, Object b)` : 比较两个对象是否相同。
2758- 底层进行非空判断,从而可以避免空指针异常,更安全!!推荐使用!!
2759-
2760- ```java
2761- public static boolean equals(Object a, Object b) {
2762- return a == b || a != null && a.equals(b);
2763- }
2764- ```
2765-
2766- * `public static boolean isNull(Object obj)` : 判断变量是否为null ,为null返回true ,反之!
2767-
2768- * `public static String toString(对象)` : 返回参数中对象的字符串表示形式
2769-
2770- * `public static String toString(对象, 默认字符串)` : 返回对象的字符串表示形式。
2755+ Objects的方法:
2756+
2757+ * `public static boolean equals(Object a, Object b)` : 比较两个对象是否相同。
2758+ 底层进行非空判断,从而可以避免空指针异常,更安全!!推荐使用!!
2759+
2760+ ```java
2761+ public static boolean equals(Object a, Object b) {
2762+ return a == b || a != null && a.equals(b);
2763+ }
2764+ ```
2765+
2766+ * `public static boolean isNull(Object obj)` : 判断变量是否为null ,为null返回true ,反之!
2767+
2768+ * `public static String toString(对象)` : 返回参数中对象的字符串表示形式
2769+
2770+ * `public static String toString(对象, 默认字符串)` : 返回对象的字符串表示形式。
27712771
27722772```java
27732773public class ObjectsDemo {
@@ -8073,12 +8073,10 @@ try(
80738073### Properties
80748074
80758075Properties:属性集对象。就是一个Map集合,一个键值对集合
8076- Properties核心作用:Properties代表的是一个属性文件,可以把键值对数据存入到一个属性文件
8077- 属性文件:后缀是.properties结尾的文件,里面的内容都是 key=value
80788076
8079- > 大型框架技术中,属性文件都是很重要的系统配置文件。
8080- > users.properties
8081- > admin=123456
8077+ 核心作用:Properties代表的是一个属性文件,可以把键值对数据存入到一个属性文件
8078+
8079+ 属性文件:后缀是.properties结尾的文件,里面的内容都是 key=value
80828080
80838081Properties方法:
80848082
@@ -8135,8 +8133,8 @@ public class PropertiesDemo02 {
81358133RandomAccessFile类:该类的实例支持读取和写入随机访问文件
81368134
81378135构造器:
8138- RandomAccessFile(File file, String mode) :创建随机访问文件流,从File参数指定的文件读取,可选择写入。
8139- RandomAccessFile(String name, String mode) :创建随机访问文件流,从指定名称的文件读取 ,可选择写入文件。
8136+ RandomAccessFile(File file, String mode) :创建随机访问文件流,从File参数指定的文件读取,可选择写入
8137+ RandomAccessFile(String name, String mode) :创建随机访问文件流,从指定名称文件读取 ,可选择写入文件
81408138
81418139常用方法:
81428140`public void seek(long pos)` : 设置文件指针偏移,从该文件开头测量,发生下一次读取或写入(插入+覆盖)
@@ -24802,316 +24800,4 @@ final void updateHead(Node<E> h, Node<E> p) {
2480224800
2480324801# Design
2480424802
24805- (正在更新)
24806-
24807- ## 单例模式
24808-
24809- 单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,
24810- 该模式的这个类永远只有一个实例。即**一个类永远只有一个对象实例**。
24811- 单例是为了节约内存,单例在有些业务场景下还必须用到
24812-
24813- * 饿汉单例设计模式
24814- 在用类获取对象的时候,对象已经提前创建好了。
24815- a.定义一个类,把构造器私有。
24816- b.定义一个静态变量存储一个对象。
24817- c.提供一个返回单例对象的方法。
24818-
24819- * 懒汉单例设计模式
24820- 在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。
24821- a.定义一个类,把构造器私有。
24822- b.定义一个静态变量存储一个对象。
24823- c.提供一个返回单例对象的方法。
24824-
24825- ```java
24826- //饿汉单例设计模式
24827- public class SingleInstanceDemo{
24828- public static void main(String[] args){
24829- Singleton s1 = Singleton.getInstance();
24830- Singleton s2 = Singleton.getInstance();
24831- System.out.println(s1 == s2);//true
24832- }
24833- }
24834- class Singleton{
24835- //在用类获取对象的时候,对象已经提前为你创建好了。
24836- public static final Singleton INSTANCE = new Singleton();
24837- private Singleton(){}
24838- //返回单例对象
24839- public static Singleton getInstance(){
24840- return INSTANCE
24841- }
24842- }
24843- ```
24844-
24845- ```java
24846- //懒汉单例设计模式
24847- public class SingleInstanceDemo{
24848- public static void main(String[] args){
24849- Singleton s1 = Singleton.getInstance();
24850- Singleton s2 = Singleton.getInstance();
24851- System.out.println(s1 == s2);//true
24852- }
24853- }
24854- class Singleton{
24855- //在用类获取对象的时候,对象自己创建好了。
24856- public static Singleton instance;
24857- private Singleton(){}
24858- //返回单例对象
24859- public static Singleton getInstance(){
24860- if (instance == null) {
24861- instance = new Singleton;
24862- }
24863- return instance;
24864- }
24865- }
24866- ```
24867-
24868-
24869-
24870- ***
24871-
24872-
24873-
24874- ## 动态代理
24875-
24876- 代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事。
24877- 动态代理只能为实现接口的实现类对象做代理(也可以只为接口做代理对象)
24878-
24879- > 在业务开发中经常存在很多重复的方法代码,他们前后的代码形式是一样的
24880- > 只有中间部分代码有差别!!这种时候代码冗余读很高
24881- > 有没有一种方法可以直接省略前后重复的代码就可以完成功能,这时候用动态代理。
24882-
24883- * 优点:
24884- * 动态代理非常的灵活,可以为任意的接口实现类对象做代理,可以为被代理对象的所有接口的所有方法做代理,动态代理可以在不改变方法源码的情况下,实现对方法功能的增强;
24885- * 动态代理类简化了编程工作,提高了软件的可扩展性,Java 反射机制可以生成任意类型的动态代理类。
24886- * 动态代理提高了开发效率。
24887- * 缺点:**只能针对接口或者接口的实现类对象做代理对象**,普通类是不能做代理对象的
24888- * 原因:**生成的代理类继承了Proxy**,因为java是单继承的,所以JDK动态代理只能代理接口。
24889-
24890- ```java
24891- public class TestDemo {
24892- public static void main(String[] args) {
24893- // 1.创建一个业务对象
24894- // 为我们的业务对象做成一个被代理的业务对象!!
24895- UserService userService = ProxyUtil.getProxy(new UserServiceImpl());
24896- String rs = userService.login("admin","123456");//走代理!
24897- System.out.println(rs);
24898- userService.deleteAll(); // 走代理!
24899- userService.updateAll(); // 走代理!
24900- }
24901- }
24902- ```
24903-
24904- ```java
24905- //业务接口
24906- public interface UserService {
24907- String login(String loginName, String passWord);
24908- void deleteAll();
24909- void updateAll();
24910- }
24911- ```
24912-
24913- ```java
24914- //业务实现类
24915- public class UserServiceImpl implements UserService {
24916- @Override
24917- public String login(String loginName, String passWord) {
24918- String flag = "登陆名称或者密码错误";
24919- if("admin".equals(loginName) && "123456".equals(passWord)){
24920- flag = "success";
24921- }
24922- try {
24923- Thread.sleep(2000);
24924- } catch (Exception e) {
24925- e.printStackTrace();
24926- }
24927- return flag;
24928- }
24929- @Override
24930- public void deleteAll() {
24931- try {
24932- Thread.sleep(1500);
24933- } catch (Exception e) {
24934- e.printStackTrace();
24935- }
24936- System.out.println("删除成功!");
24937- }
24938- @Override
24939- public void updateAll() {
24940- try {
24941- Thread.sleep(500);
24942- } catch (Exception e) {
24943- e.printStackTrace();
24944- }
24945- System.out.println("更新成功!");
24946- }
24947- }
24948- ```
24949-
24950- 代理类:帮助我们做一个被代理的业务对象返回。
24951- java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一个静态方法来为一组接口的实现类动态地生成代理类及其对象。
24952- **public static Object newProxyInstance(ClassLoader loader,Class[] interfaces, InvocationHandler h)**
24953- 参数一:类加载器,负责加载到时候做好的业务代理对象!
24954- 参数二:被代理业务对象的**全部实现的接口**,以便代理对象可以知道要为哪些方法做代理。
24955- 参数三:代理真正的执行方法,也就是代理的处理逻辑!
24956-
24957- ```java
24958- public class ProxyUtil {
24959- //做一个被代理的业务对象返回!
24960- public static <T> T getProxy(Object obj) {
24961- return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
24962- obj.getClass().getInterfaces(), new InvocationHandler() {
24963- @Override
24964- public Object invoke(Object proxy, Method method, Object[]
24965- params) throws Throwable {
24966- // proxy : 业务代理对象本身。用不到
24967- // method: 代表当前正在被代理执行的方法!!
24968- // params: 代表的是执行方法的参数,数组的形式!
24969- long startTime = System.currentTimeMillis();
24970-
24971- // 真正触发真实的方法执行
24972- Object rs = method.invoke(obj,params);
24973-
24974- long endTime = System.currentTimeMillis();
24975- sout(method.getName()+"方法耗时:"+
24976- (endTime - startTime)/1000.0+"s");
24977- return rs; // 返回方法执行的结果!!
24978- }
24979- });
24980- }
24981- }
24982- ```
24983-
24984-
24985-
24986- ***
24987-
24988-
24989-
24990- ## 工厂模式
24991-
24992- 工厂设计模式:
24993-
24994- * 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一
24995-
24996- * 这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式
24997-
24998- * 以前我们创建类对象时, 都是使用new 对象的形式创建,,除new 对象方式以外,工厂模式也可以创建对象
24999-
25000- 工厂设计模式的作用:
25001-
25002- * 对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
25003- * 可以实现类与类之间的解耦操作(核心思想,重点)
25004-
25005- 优点:工厂模式的存在可以改变创建对象的方式,解决类与类之间的**耦合**。
25006- 缺点:工厂设计模式多了一个工厂类!!!
25007-
25008- ```java
25009- public class FactoryDemo {
25010- public static void main(String[] args) {
25011- Animal a = FactoryPattern.createAniaml();
25012- a.run();
25013- }
25014- }
25015- // 工厂设计模式
25016- public class FactoryPattern {
25017- // 生产对象的方法:工厂方法
25018- public static Animal createAniaml(){
25019- return new Dog();
25020- }
25021- }
25022-
25023- public abstract class Animal {
25024- public abstract void run();
25025- }
25026- public class Cat extends Animal {
25027- @Override
25028- public void run() {
25029- System.out.println("猫跑的贼溜~~~~");
25030- }
25031- }
25032- public class Dog extends Animal {
25033- @Override
25034- public void run() {
25035- System.out.println("狗跑的也贼溜~~~~");
25036- }
25037- }
25038- ```
25039-
25040-
25041-
25042- ***
25043-
25044-
25045-
25046- ## 装饰模式
25047-
25048- 装饰模式指的是在不改变原类, 动态地扩展一个类的功能。
25049- 思想:是创建一个新类,包装原始类,从而在新类中提升原来类的功能!!
25050-
25051- 装饰模式可以在不改变原类的基础上对类中的方法进行扩展增强,实现原则为:
25052- 1.定义父类。
25053- 2.定义原始类,继承父类,定义功能。
25054- 3.定义装饰类,继承父类,包装原始类,增强功能!!
25055-
25056- ```java
25057- public class Demo {
25058- public static void main(String[] args) {
25059- InputStream is = new BufferedInputStrem(new FileInputStream());
25060- is.read();
25061- is.close();
25062- }
25063- }
25064- public abstract class InputStream {
25065- public abstract void read();
25066- public abstract void close();
25067- }
25068- public class FileInputStream extends InputStream {
25069- @Override
25070- public void read() {
25071- System.out.println("读取数据~~~");
25072- }
25073-
25074- @Override
25075- public void close() {
25076- System.out.println("关闭流~~~");
25077- }
25078- }
25079- // 装饰模式!提升原始功能!!!
25080- public class BufferedInputStrem extends InputStream {
25081- private InputStream is ;
25082- public BufferedInputStrem(InputStream is){
25083- this.is = is;
25084- }
25085- @Override
25086- public void read() {
25087- System.out.println("开启高效缓冲读取~");
25088- is.read();
25089- }
25090- @Override
25091- public void close() {
25092- is.close();
25093- }
25094- }
25095- ```
25096-
25097-
25098-
25099-
25100-
25101-
25102-
25103-
25104-
25105-
25106-
25107-
25108-
25109-
25110-
25111-
25112-
25113-
25114-
25115-
25116-
25117-
24803+ (更新中)
0 commit comments