Java设计模式学习以及底层源码分析
源码在分支master
工厂模式
把具体创建产品的细节封装起来,你要什么产品,我给你什么产品即可。
简单工厂模式
工厂方法模式
缓存层:抽象类
抽象工厂模式
缓存层是:接口
原型模式
问题:
原型模式的源码分析:Spring 中的 getBean()这个方法低层实现。是否选择单例、和原型模式。
自己的Code
/******************************************************************************** Package: com.example.demo.design.prototype* Type: User* Date: 2022-03-06 14:22** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.prototype;import lombok.Data;
import lombok.extern.slf4j.Slf4j;/*** 功能描述: 原型模式分析:* 无线创建相同对象 但是对象的地址值都不是相同的*** @author Songxianyang* @date 2022-03-06 14:22*/
@Data
@Slf4j
public class User implements Cloneable {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" + "name='" + name + '\'' + ", age=" + age + '}';}@Overrideprotected Object clone() {User user =null;try {user = (User) super.clone();} catch (CloneNotSupportedException e) {log.error("clone: ", "无法或不应克隆对象");}return user;}
}
实现:
/******************************************************************************** Package: com.example.demo.design.prototype* Type: Test* Date: 2022-03-06 14:29** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.prototype;/*** 功能描述:** @author Songxianyang* @date 2022-03-06 14:29*/
public class Test {public static void main(String[] args) {User user = new User("sxy", 22);System.out.println(user);System.out.println(user.clone());System.out.println(user.clone());System.out.println(user==user.clone());}
}
建造者模式
源码盘点
项目截图
/******************************************************************************** Package: com.example.demo.design.builder* Type: BuilderHouse* Date: 2022-03-06 21:14** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.builder;/*** 功能描述: 抽象的一个构建者** @author Songxianyang* @date 2022-03-06 21:14*/
public interface BuilderHouse {House house = new House();/*** 地基*/void foundation();/*** 砌墙*/void buildWall();/*** 封顶*/void capping();/*** 构建对象* @return house*/default House builder() {return house;}
}
/******************************************************************************** Package: com.example.demo.design.builder* Type: Commander* Date: 2022-03-06 21:29** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.builder;/*** 功能描述: 指挥者:负责怎么去执行 :行为** @author Songxianyang* @date 2022-03-06 21:29*/
public class Commander {BuilderHouse builderHouse = null;public Commander(BuilderHouse builderHouse) {this.builderHouse = builderHouse;}public House builder () {builderHouse.foundation();builderHouse.buildWall();builderHouse.capping();return builderHouse.builder();}
}
/******************************************************************************** Package: com.example.demo.design.builder* Type: HighHouse* Date: 2022-03-06 21:28** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.builder;/*** 功能描述: 高楼** @author Songxianyang* @date 2022-03-06 21:28*/
public class HighHouse implements BuilderHouse {@Overridepublic void foundation() {System.out.println("高楼打地基");}@Overridepublic void buildWall() {System.out.println("高楼砌墙");}@Overridepublic void capping() {System.out.println("高楼 吊顶");}
}
/******************************************************************************** Package: com.example.demo.design.builder* Type: House* Date: 2022-03-06 21:11** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.builder;import lombok.Data;/*** 功能描述: 房子是一个产品类** @author Songxianyang* @date 2022-03-06 21:11*/
@Data
public class House {private String spar;private Integer height;
}
/******************************************************************************** Package: com.example.demo.design.builder* Type: PlainHouse* Date: 2022-03-06 21:20** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.builder;/*** 功能描述:普通房子 实现类** @author Songxianyang* @date 2022-03-06 21:20*/
public class PlainHouse implements BuilderHouse {@Overridepublic void foundation() {System.out.println("普通房子打地基");}@Overridepublic void buildWall() {System.out.println("普通房子砌墙");}@Overridepublic void capping() {System.out.println("普通房子 吊顶");}
}
/******************************************************************************** Package: com.example.demo.design.builder* Type: Test* Date: 2022-03-06 21:33** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.builder;/*** 功能描述:测试类** @author Songxianyang* @date 2022-03-06 21:33*/
public class Test {public static void main(String[] args) {//普通房子PlainHouse plainHouse = new PlainHouse();Commander commander = new Commander(plainHouse);commander.builder();System.out.println("-------------------");//高楼大厦HighHouse highHouse = new HighHouse();Commander high = new Commander(highHouse);high.builder();}
}
测试截图
源码分析
new StringBuilder();
建造者 建造一个产品需要那些步骤:Appendable
具体建造出什么样的抽象对象具有什么功能:AbstractStringBuilder
指挥者:具体指挥返回什么样的对象StringBuilder、StringBuffer
适配器模式-结构化
类适配器
上代码
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Voltage* Date: 2022-03-12 10:14** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.classadapter;/*** 功能描述:5V电压转换器** @author Songxianyang* @date 2022-03-12 10:14*/
public class Change extends Source implements VoltageAdapter {@Overridepublic String output5v() {String v220 = super.output();v220="5v";return v220;}
}
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Phone* Date: 2022-03-12 10:28** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.classadapter;/*** 功能描述:手机充电** @author Songxianyang* @date 2022-03-12 10:28*/
public class Phone {private VoltageAdapter adapter;public Phone(VoltageAdapter adapter) {this.adapter = adapter;}public void chargePhone() {System.out.println("我得手机以及充上"+adapter.output5v());}
}
/******************************************************************************** Package: com.example.demo.design.adapter* Type: Source* Date: 2022-03-12 10:03** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.classadapter;/*** 类适配器* 功能描述:电源类220v 被适配器** @author Songxianyang* @date 2022-03-12 10:03*/
public class Source {public String output() {return "220v";}
}
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Test* Date: 2022-03-12 10:34** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.classadapter;/*** 功能描述:** @author Songxianyang* @date 2022-03-12 10:34*/
public class Test {public static void main(String[] args) {Phone phone = new Phone(new Change());phone.chargePhone();}
}
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: SourceAdapter* Date: 2022-03-12 10:06** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.classadapter;/*** 功能描述: 充电器适配器** @author Songxianyang* @date 2022-03-12 10:06*/
public interface VoltageAdapter {/*** 输出5v电压* @return s*/String output5v();
}
对象适配器
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Voltage* Date: 2022-03-12 10:14** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.objadapter;/*** 功能描述:5V电压转换器 :适配器** @author Songxianyang* @date 2022-03-12 10:14*/
public class Change {private Source source = new Source();public String output5v() {String v220 = source.output();v220="5v";return v220;}
}
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Phone* Date: 2022-03-12 10:28** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.objadapter;/*** 功能描述:手机充电** @author Songxianyang* @date 2022-03-12 10:28*/
public class Phone {private Change change= new Change();public void chargePhone() {System.out.println("我得手机以及充上"+change.output5v());}
}
/******************************************************************************** Package: com.example.demo.design.adapter* Type: Source* Date: 2022-03-12 10:03** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.objadapter;/*** 类适配器* 功能描述:电源类220v 被适配器** @author Songxianyang* @date 2022-03-12 10:03*/
public class Source {public String output() {return "220v";}
}
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Test* Date: 2022-03-12 10:34** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.objadapter;/*** 功能描述:** @author Songxianyang* @date 2022-03-12 10:34*/
public class Test {public static void main(String[] args) {Phone phone = new Phone();phone.chargePhone();}
}
接口适配器
结构:
代码以及优化
/******************************************************************************** Package: com.example.demo.design.adapter.interfaceadapter* Type: AVoltageAdapter* Date: 2022-03-12 15:48** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.interfaceadapter;/*** 功能描述:抽象的一个多种电压 初始化** @author Songxianyang* @date 2022-03-12 15:48*/
public abstract class AbsVoltageAdapter implements IVoltageAdapter {@Overridepublic String v5() {return null;}@Overridepublic String v21() {return null;}
}
/******************************************************************************** Package: com.example.demo.design.adapter.interfaceadapter* Type: V* Date: 2022-03-12 15:47** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.interfaceadapter;/*** 功能描述: 多种电压 接口** @author Songxianyang* @date 2022-03-12 15:47*/
public interface IVoltageAdapter {/*** 充手机* @return s*/public String v5();/*** 充电车* @return s*/String v21();/*......*/
}
/******************************************************************************** Package: com.example.demo.design.adapter.interfaceadapter* Type: Phone* Date: 2022-03-12 15:56** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.interfaceadapter;/*** 功能描述:手机需要5v电压** @author Songxianyang* @date 2022-03-12 15:56*/
public class Phone {private AbsVoltageAdapter abs;public Phone(AbsVoltageAdapter abs) {this.abs = abs;}public void change() {System.out.println("小米手机已经充上"+abs.v5());}
}
/******************************************************************************** Package: com.example.demo.design.adapter.interfaceadapter* Type: PhoneAdapter* Date: 2022-03-12 15:53** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.interfaceadapter;/*** 功能描述:手机适配器5v* 优化点* @author Songxianyang* @date 2022-03-12 15:53*/
public class PhoneAdapter extends AbsVoltageAdapter {@Overridepublic String v5() {return "5v";}
}
/******************************************************************************** Package: com.example.demo.design.adapter.classadapter* Type: Test* Date: 2022-03-12 10:34** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.adapter.interfaceadapter;/*** 功能描述:** @author Songxianyang* @date 2022-03-12 10:34*/
public class Test {public static void main(String[] args) {Phone phone = new Phone(new PhoneAdapter());phone.change();}
}
源码分析 mvc
源码 分析
DispatcherServlet dispatcherServlet = new DispatcherServlet();
DispatcherServlet:{方法:doDispatch(HttpServletRequest request){// 获取 requestHttpServletRequest processedRequest = request;// 执行器对象:HandlerHandlerExecutionChain mappedHandler = null;// 获取映射执行器对象mappedHandler = this.getHandler(processedRequest);// 获取具体的 HandlerAdapter 的适配器HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());// 不同的适配器 返回不同的 mvmv = ha.handle(processedRequest, response, mappedHandler.getHandler());//被调用的代码//遍历获取具体的handler 并返回protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {if (this.handlerAdapters != null) {Iterator var2 = this.handlerAdapters.iterator();while(var2.hasNext()) {HandlerAdapter adapter = (HandlerAdapter)var2.next();if (adapter.supports(handler)) {return adapter;}}}throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");}}//接口 :具体的实现 有6个适配器public interface HandlerAdapter {handler 标记boolean supports(Object handler);@NullableModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;@Deprecatedlong getLastModified(HttpServletRequest request, Object handler);
}
}
适配器到此结束;
桥接模式-结构化
代码分享
类图
/******************************************************************************** Package: com.example.demo.bridg* Type: Brand* Date: 2022-03-12 20:47** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:为手机品牌做的接口** @author Songxianyang* @date 2022-03-12 20:47*/
public interface Brand {/*** 打电话*/void call();/*** 上网*/void net();
}
/******************************************************************************** Package: com.example.demo.bridg* Type: Flat* Date: 2022-03-12 20:55** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:平板 手机** @author Songxianyang* @date 2022-03-12 20:55*/
public class FlatPhone extends StylePhone {private String name = "平板:";public FlatPhone(Brand brand) {super(brand);}@Overridepublic void call() {System.out.println(name);super.call();}@Overrideprotected void net() {System.out.println(name);super.net();}
}
/******************************************************************************** Package: com.example.demo.bridg* Type: FlipPhone* Date: 2022-03-12 20:55** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:翻盖 手机** @author Songxianyang* @date 2022-03-12 20:55*/
public class FlipPhone extends StylePhone {private String name = "翻盖:";public FlipPhone(Brand brand) {super(brand);}@Overridepublic void call() {System.out.println(name);super.call();}@Overrideprotected void net() {System.out.println(name);super.net();}
}
/******************************************************************************** Package: com.example.demo.bridg* Type: XiaoMPhone* Date: 2022-03-12 20:49** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:小米手机** @author Songxianyang* @date 2022-03-12 20:49*/
public class HuaweiPhone implements Brand {@Overridepublic void call() {System.out.println("Huawei手机打电话");}@Overridepublic void net() {System.out.println("Huawei手机上网");}
}
/******************************************************************************** Package: com.example.demo.bridg* Type: StylePhone* Date: 2022-03-12 20:53** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:手机样式** @author Songxianyang* @date 2022-03-12 20:53*/
public abstract class StylePhone {private Brand brand;public StylePhone(Brand brand) {this.brand = brand;}// 开始搭桥protected void call(){brand.call();}protected void net() {brand.net();}
}
/******************************************************************************** Package: com.example.demo.bridg* Type: Test* Date: 2022-03-12 20:51** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:桥接模式 : 抽象类与接口分开** @author Songxianyang* @date 2022-03-12 20:51*/
public class Test {public static void main(String[] args) {StylePhone flatPhone = new FlatPhone(new XiaoMiPhone());flatPhone.call();flatPhone.net();System.out.println("----------------------");StylePhone flipPhone = new FlipPhone(new XiaoMiPhone());flipPhone.call();flipPhone.net();System.out.println("-----------------");StylePhone huawei = new FlipPhone(new HuaweiPhone());huawei.call();huawei.net();}
}
/******************************************************************************** Package: com.example.demo.bridg* Type: XiaoMPhone* Date: 2022-03-12 20:49** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.bridg;/*** 功能描述:小米手机** @author Songxianyang* @date 2022-03-12 20:49*/
public class XiaoMiPhone implements Brand{@Overridepublic void call() {System.out.println("Xiaomi手机打电话");}@Overridepublic void net() {System.out.println("Xiaomi手机上网");}
}
jdbc源码分析
没有分析明白
桥接总结
装饰者设计模式
需求
代码结构
详细代码 展示
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: AmericanoCoffee* Date: 2022-03-13 15:08** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述:美式咖啡** @author Songxianyang* @date 2022-03-13 15:08*/
public class AmericanoCoffee extends Coffee{public AmericanoCoffee() {setName("美式咖啡");setPrice(2.0f);}
}
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: ChinaCoffee* Date: 2022-03-13 15:12** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述:中国咖啡** @author Songxianyang* @date 2022-03-13 15:12*/
public class ChinaCoffee extends Coffee{public ChinaCoffee() {setName("中国咖啡");setPrice(2.0f);}
}
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: Coffee* Date: 2022-03-13 15:07** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述:** @author Songxianyang* @date 2022-03-13 15:07*/
public class Coffee extends Drink {@Overridefloat count() {return getPrice();}
}
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: DecoratorSeasone* Date: 2022-03-13 15:14** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述: 装饰者 调料** @author Songxianyang* @date 2022-03-13 15:14*/
public class DecoratorSeason extends Drink{private Drink drink;public DecoratorSeason(Drink drink) {this.drink = drink;}@Overridefloat count() {// getPrice 当前调料的钱 drink.count() 上一次计算的钱return getPrice()+drink.count();}@Overridepublic void setName(String name) {super.setName(name+"&&"+drink.getName());}
}
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: Drink* Date: 2022-03-13 15:01** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述: 饮料类 抽象起来** @author Songxianyang* @date 2022-03-13 15:01*/public abstract class Drink {private String name;private float price;/*** 计算价格* @return*/abstract float count();public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}
}
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: Milk* Date: 2022-03-13 15:21** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述:调料 牛奶** @author Songxianyang* @date 2022-03-13 15:21*/
public class Milk extends DecoratorSeason{public Milk(Drink drink) {super(drink);setName("调料 牛奶");setPrice(1.0f);}}
/******************************************************************************** Package: com.example.demo.design.decorator.master* Type: SoyBean* Date: 2022-03-13 15:23** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述:豆浆** @author Songxianyang* @date 2022-03-13 15:23*/
public class SoyBean extends DecoratorSeason{public SoyBean(Drink drink) {super(drink);setName("豆浆");setPrice(2.0f);}
}
/******************************************************************************** Package: com.example.demo.design.decorator* Type: Test* Date: 2022-02-20 13:36** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.decorator.master;/*** 功能描述:** @author Songxianyang* @date 2022-02-20 13:36*/
public class Test {public static void main(String[] args) {//普通一杯 中国咖啡Drink order = new ChinaCoffee();System.out.println(order.getPrice());// 中国咖啡+牛奶order= new Milk(order);System.out.println("咖啡总价"+ order.count());System.out.println(order.getName());// 中国咖啡+豆浆order=new SoyBean(order);System.out.println("咖啡总价"+ order.count());System.out.println(order.getName());// 中国咖啡+豆浆+豆浆order=new SoyBean(order);System.out.println("咖啡总价"+ order.count());System.out.println(order.getName());}
}
测试截图
注意的点: 在装饰器类:DecoratorSeason 中两个的方法 。有说明
装饰器 挺绕的 面试经常问
IO 分析
/******************************************************************************** Package: com.example.demo.jdk* Type: Io* Date: 2022-03-15 22:25** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.jdk;import java.io.DataInputStream;
import java.io.FileInputStream;/*** 功能描述:** @author Songxianyang* @date 2022-03-15 22:25*/
public class Io {public static void main(String[] args) throws Exception {/*** FilterInputStream 装饰器* protected volatile InputStream in; 饮料*DataInputStream 咖啡*/DataInputStream dataInputStream = new DataInputStream(new FileInputStream(""));System.out.println(dataInputStream.read());dataInputStream.close();}
}
外观模式
蛋糕外观模式 Code
类
/******************************************************************************** Package: com.example.demo.design.facade* Type: AbsCake* Date: 2022-04-09 15:29** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述:** @author Songxianyang* @date 2022-04-09 15:29*/
public abstract class AbsCake {/*** 开启*/public abstract void start();/*** 关闭*/public abstract void end();}
/******************************************************************************** Package: com.example.demo.design.facade* Type: Baking* Date: 2022-04-09 15:10** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述:烘烤** @author Songxianyang* @date 2022-04-09 15:10*/
public class Baking extends AbsCake{@Overridepublic void start() {System.out.println("开启烘烤机器准备蛋糕");}@Overridepublic void end() {System.out.println("关闭烘烤机");}
}
/******************************************************************************** Package: com.example.demo.design.facade* Type: CakeShopFacade* Date: 2022-04-09 15:05** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述: 蛋糕外观类* 我得理解:将功能复杂的调用关系封装在一个方法中,调用端调用即可。比较好理解* 例子:蛋糕店: 水果机器、烘烤机、打蛋器、奶油机、、、、** @author Songxianyang* @date 2022-04-09 15:05*/public class CakeShopFacade {/*** 使用聚合的关系来使用对象 对 类的使用不够灵活 用着玩 学习外观模式* 面向接口编程 整着玩*/private Baking baking;private Cream cream;private Fruits fruits;private Whisk whisk;public CakeShopFacade(Baking baking, Cream cream, Fruits fruits, Whisk whisk) {this.baking = baking;this.cream = cream;this.fruits = fruits;this.whisk = whisk;}public void startIn() {baking.start();cream.start();fruits.start();whisk.start();}public void end() {baking.end();cream.end();fruits.end();whisk.end();}
}
/******************************************************************************** Package: com.example.demo.design.facade* Type: Cream* Date: 2022-04-09 15:28** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述:奶油机器** @author Songxianyang* @date 2022-04-09 15:28*/
public class Cream extends AbsCake{@Overridepublic void start() {System.out.println("奶油机器开始打奶油");}@Overridepublic void end() {System.out.println("奶油机器关闭");}//、、、、
}
/******************************************************************************** Package: com.example.demo.design.facade* Type: Fruits* Date: 2022-04-09 15:09** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述: 水果机器** @author Songxianyang* @date 2022-04-09 15:09*/
public class Fruits extends AbsCake{@Overridepublic void start() {System.out.println("各种水果已经做好");}@Overridepublic void end() {System.out.println("关闭水果机器");}}
/******************************************************************************** Package: com.example.demo.design.facade* Type: Test* Date: 2022-04-09 15:44** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述:** @author Songxianyang* @date 2022-04-09 15:44*/
public class Test {public static void main(String[] args) {CakeShopFacade facade = new CakeShopFacade(new Baking(), new Cream(), new Fruits(), new Whisk());facade.startIn();}
}
/******************************************************************************** Package: com.example.demo.design.facade* Type: Whisk* Date: 2022-04-09 15:10** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.facade;/*** 功能描述:打蛋器** @author Songxianyang* @date 2022-04-09 15:10*/
public class Whisk extends AbsCake{@Overridepublic void start() {System.out.println("打蛋器开始打蛋");}@Overridepublic void end() {System.out.println("关闭打蛋器");}
}
测试结果
mybaitis 底层 外感模式 源码分析
/******************************************************************************** Package: com.example.demo.jdk* Type: MybatisFacade* Date: 2022-04-09 15:45** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.jdk;import org.apache.ibatis.session.Configuration;/*** 功能描述:外观模式下的mybatis** @author Songxianyang* @date 2022-04-09 15:45*/
public class MybatisFacade {public static void main(String[] args) {new Configuration();}
}
分析如下
public MetaObject newMetaObject(Object object) {return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory);}
其中调用的方法:
public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {return object == null ? SystemMetaObject.NULL_META_OBJECT : new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);}
在掉构造器private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {this.originalObject = object;this.objectFactory = objectFactory;this.objectWrapperFactory = objectWrapperFactory;this.reflectorFactory = reflectorFactory;if (object instanceof ObjectWrapper) {this.objectWrapper = (ObjectWrapper)object;} else if (objectWrapperFactory.hasWrapperFor(object)) {this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);} else if (object instanceof Map) {this.objectWrapper = new MapWrapper(this, (Map)object);} else if (object instanceof Collection) {this.objectWrapper = new CollectionWrapper(this, (Collection)object);} else {this.objectWrapper = new BeanWrapper(this, object);}}
享元 模式
结构
/******************************************************************************** Package: com.example.demo.design.enjoy* Type: Test* Date: 2022-04-09 21:20** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.enjoy;/*** 功能描述:** @author Songxianyang* @date 2022-04-09 21:20*/
public class Test {public static void main(String[] args) {WebsiteFactory factory = new WebsiteFactory();Website websiteWX = factory.getWebsite("微信公众号");websiteWX.use(new User("SteveCode"));Website websiteWX1 = factory.getWebsite("微信公众号");websiteWX1.use(new User("SteveCode"));Website websiteCSDN = factory.getWebsite("CSDN");websiteCSDN.use(new User("SteveCode."));System.out.println(factory.size());}
}
/******************************************************************************** Package: com.example.demo.design.enjoy* Type: User* Date: 2022-04-09 21:07** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.enjoy;import lombok.Data;/*** 功能描述: 外部状态 :用户类* 一直发生变化的对象 :外部状态** @author Songxianyang* @date 2022-04-09 21:07*/
@Data
public class User {private String name;public User(String name) {this.name = name;}
}
/******************************************************************************** Package: com.example.demo.design.enjoy* Type: Website* Date: 2022-04-09 21:08** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.enjoy;/*** 功能描述:网站 具体实现** @author Songxianyang* @date 2022-04-09 21:08*/
public class Website extends WebsiteAbstract {private String type;public Website(String type) {this.type = type;}@Overridepublic void use(User user) {System.out.println("当前网站正在使用中。。。。"+"该类型是:"+type+",用户:"+user.getName()+"-体验良好");}
}
/******************************************************************************** Package: com.example.demo.design.enjoy* Type: WebsiteAbstract* Date: 2022-04-09 21:06** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.enjoy;/*** 功能描述: 享元模式 :共享 对象* 网站案例* 抽象类* @author Songxianyang* @date 2022-04-09 21:06*/
public abstract class WebsiteAbstract {/*** 网站的使用*/public abstract void use(User user);}
/******************************************************************************** Package: com.example.demo.design.enjoy* Type: WebsiteFactory* Date: 2022-04-09 21:13** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.enjoy;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** 功能描述: 网站工厂** @author Songxianyang* @date 2022-04-09 21:13*/
public class WebsiteFactory {private Map<String, Website> map = new HashMap<>();public Website getWebsite(String type) {//如果没有该类型就创建if (Objects.isNull(map.get(type))) {map.put(type,new Website(type));return map.get(type);}// 有就直接使用return map.get(type);}public int size() {return map.size();}
}
执行结果:
Integer 源码分析享元模式
/******************************************************************************** Package: com.example.demo.jdk* Type: Enjoy* Date: 2022-04-09 21:58** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.jdk;/*** 功能描述:** @author Songxianyang* @date 2022-04-09 21:58*/
public class Enjoy {public static void main(String[] args) {Integer integer1 = Integer.valueOf(19);Integer integer12 = Integer.valueOf(19);Integer integer2 = Integer.valueOf(200);Integer integer22 = Integer.valueOf(200);System.out.println(integer1 == integer12);System.out.println(integer2 == integer22); }
// 分析 先从cache中找对应的 池中的数据。数据范围-128到127
// 否则就创建新的对象
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
}
代理模式:
静态代理
优缺点
代码结构
Code实现
/******************************************************************************** Package: com.example.demo.design.proxy.staticproxy* Type: ILog* Date: 2022-04-10 13:40** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.staticproxy;/*** 功能描述: 日志接口* 静态代理:* 优点:对目标方法 功能增强* 缺点:不易于维护* @author Songxianyang* @date 2022-04-10 13:40*/
public interface ILog {/*** 打印日志*/void pint();
}
/******************************************************************************** Package: com.example.demo.design.proxy.staticproxy* Type: ILogImpl* Date: 2022-04-10 13:40** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.staticproxy;/*** 功能描述:** @author Songxianyang* @date 2022-04-10 13:40*/
public class LogImpl implements ILog {@Overridepublic void pint() {System.out.println("打印日志");}
}
/******************************************************************************** Package: com.example.demo.design.proxy.staticproxy* Type: LogProxy* Date: 2022-04-10 13:42** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.staticproxy;/*** 功能描述:* 实现对方法的增强* @author Songxianyang* @date 2022-04-10 13:42*/
public class LogProxy implements ILog {private ILog iLog;public LogProxy(ILog iLog) {this.iLog = iLog;}@Overridepublic void pint() {//这边写的可以是业务方法:比喻:事务的开启System.out.println("开启事务-----");//执行目标方法:可以做判断 是否有异常 有 回滚 无 提交iLog.pint();//假设 无System.out.println("提交事务-----");}
}
/******************************************************************************** Package: com.example.demo.design.proxy.staticproxy* Type: Test* Date: 2022-04-10 13:47** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.staticproxy;/*** 功能描述:** @author Songxianyang* @date 2022-04-10 13:47*/
public class Test {public static void main(String[] args) {// 目标类ILog log = new LogImpl();// 代理类LogProxy proxy = new LogProxy(log);// 调用代理中的方法proxy.pint();}
}
运行截图
动态代理
结构
/******************************************************************************** Package: com.example.demo.design.proxy.staticproxy* Type: ILog* Date: 2022-04-10 13:40** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.dynamic;/*** 功能描述: 日志接口* 动态代理:jdk 代理 接口代理* 优点:对目标方法 功能增强* 缺点:易于维护* @author Songxianyang* @date 2022-04-10 13:40*/
public interface ILog {/*** 打印日志*/void pint();/*** 打印一个数*/void num( int i);int count(int j);
}
/******************************************************************************** Package: com.example.demo.design.proxy.staticproxy* Type: ILogImpl* Date: 2022-04-10 13:40** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.dynamic;/*** 功能描述:** @author Songxianyang* @date 2022-04-10 13:40*/
public class LogImpl implements ILog {@Overridepublic void pint() {System.out.println("打印日志");}@Overridepublic void num(int i) {System.out.println(i);}@Overridepublic int count(int j) {return j;}
}
/******************************************************************************** Package: com.example.demo.design.proxy.dynamic* Type: LogProxyFactory* Date: 2022-04-10 14:13** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 功能描述:* 代理工厂* @author Songxianyang* @date 2022-04-10 14:13*/
public class LogProxyFactory {/*** 目标对象*/private Object target;public LogProxyFactory(Object target) {this.target = target;}/*** 获取目标对象实例* @return*/public Object getTargetExample() {return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("jdk 代理开始");// 两个参数进行说明 1、目标类 2、参数数组Object invoke = method.invoke(target, args);System.out.println("jdk 代理结束");return invoke;}});}
}
/******************************************************************************** Package: com.example.demo.design.proxy.dynamic* Type: Test* Date: 2022-04-10 14:21** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.dynamic;/*** 功能描述:** @author Songxianyang* @date 2022-04-10 14:21*/
public class Test {public static void main(String[] args) {ILog log = new LogImpl();LogProxyFactory factory = new LogProxyFactory(log);// 强制类型转换 要转成 接口的类型 特别奇怪ILog logn = (ILog) factory.getTargetExample();//logn.pint();//logn.num(99);System.out.println(logn.count(9));}
}
运行测试
cglib 动态代理
结构
/******************************************************************************** Package: com.example.demo.design.proxy.cjlib* Type: Log* Date: 2022-04-10 16:56** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.cjlib;/*** 功能描述:cglib 代理* 对象代理 并不需要来代理接口*** @author Songxianyang* @date 2022-04-10 16:56*/
public class Log {public void pint() {System.out.println("SteveCode 在学习 cglib 动态代理 哈哈");}
}
/******************************************************************************** Package: com.example.demo.design.proxy.cjlib* Type: ProxyFactory* Date: 2022-04-10 16:57** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.cjlib;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** 功能描述:** @author Songxianyang* @date 2022-04-10 16:57*/
public class ProxyFactory implements MethodInterceptor {/*** 目标对象*/private Object target;public ProxyFactory(Object target) {this.target = target;}/*** 获取代理对象 比较重要*/public Object getTargetExample() {// 创建工具类Enhancer enhancer = new Enhancer();// 设置父类enhancer.setSuperclass(target.getClass());// 设置回调函数enhancer.setCallback(this);// 创建代理对象return enhancer.create();}/*** 方法增强* @param o* @param method 代理对象中的执行方法* @param args 参数* @param methodProxy 代理的方法* @return* @throws Throwable*/@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("cglib 代理方法的增强~~~~");Object invoke = method.invoke(target, args);System.out.println("cglib 代理方法的提交~~~~");return invoke;}
}
/******************************************************************************** Package: com.example.demo.design.proxy.cjlib* Type: Test* Date: 2022-04-10 17:10** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.proxy.cjlib;/*** 功能描述:** @author Songxianyang* @date 2022-04-10 17:10*/
public class Test {public static void main(String[] args) {// 目标对象Log log = new Log();//获取代理工厂ProxyFactory factory = new ProxyFactory(log);// 或缺代理对象Log log2 = (Log) factory.getTargetExample();// 执行被代理的方法log2.pint();}
}
运行结果
模板方法模式
结构
代码
/******************************************************************************** Package: com.example.demo.design.template* Type: AbsBeanMlik* Date: 2022-04-10 17:43** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.template;/*** 功能描述: 制作不同口味豆浆* 口味:发生改变 (抽象)* 制作过程 都是相同的 (模板)** 模板方法:行为型模式*** @author Songxianyang* @date 2022-04-10 17:43*/
public abstract class AbsBeanMilk {/*** 口味 调味料*/public abstract void dressing();/*** 制作模板*/public void template() {//选材putBean();// 什么口味dressing();// 豆浆机开始打磨beanMachine();}/*** 什么类型 的 大豆*/public abstract void putBean();/****/public void beanMachine() {System.out.println("中国制造:SteveCode牌 豆浆机 开始打磨");}}
/******************************************************************************** Package: com.example.demo.design.template* Type: Strawberry* Date: 2022-04-10 17:52** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.template;/*** 功能描述: 草莓味** @author Songxianyang* @date 2022-04-10 17:52*/
public class Strawberry extends AbsBeanMilk{@Overridepublic void dressing() {System.out.println("草莓味");}@Overridepublic void putBean() {System.out.println("普通大豆");}
}
/******************************************************************************** Package: com.example.demo.design.template* Type: A* Date: 2022-04-10 17:42** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.template;/*** 功能描述:模板方法模式** @author Songxianyang* @date 2022-04-10 17:42*/
public class Test {public static void main(String[] args) {AbsBeanMilk strawberry = new Strawberry();strawberry.template();System.out.println("-------");AbsBeanMilk watermelon = new Watermelon();watermelon.template();}
}
/******************************************************************************** Package: com.example.demo.design.template* Type: Watermelon* Date: 2022-04-10 17:54** Copyright (c) 2022 HUANENG GUICHENG TRUST CORP.,LTD All Rights Reserved.** You may not use this file except in compliance with the License.*******************************************************************************/
package com.example.demo.design.template;/*** 功能描述: 西瓜味** @author Songxianyang* @date 2022-04-10 17:54*/
public class Watermelon extends AbsBeanMilk{@Overridepublic void dressing() {System.out.println("西瓜味");}@Overridepublic void putBean() {System.out.println("优质大豆");}
}
运行结果
Java设计模式学习以及底层源码分析相关推荐
- idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)
课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...
- idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)
课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...
- 视频教程-Spring底层源码分析-Java
Spring底层源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大促活动技术保 ...
- 计算机毕业设计Java移动学习网站(系统+源码+mysql数据库+Lw文档)
计算机毕业设计Java移动学习网站(系统+源码+mysql数据库+Lw文档) 计算机毕业设计Java移动学习网站(系统+源码+mysql数据库+Lw文档) 本源码技术栈: 项目架构:B/S架构 开发语 ...
- sheng的学习笔记-Vector源码分析
概述 Vector底层也是数组,跟ArrayList很像(先看下ArrayList,再看Vector会很轻松),ArrayList可参考下文,并且由于效率低,已经被淘汰了,大概瞅瞅得了 sheng的学 ...
- Thinkphp底层源码分析
Thinkphp底层源码分析第一章 首先我们学习此章节的内容大家可能需要有一些基础才行,接着对PHP内置字符窜数组相关函数会用的比较多一点,当然不太熟悉的朋友,其实可以借助手册看下去.下面我们开始正题 ...
- Jaca集合(四)Vector集合底层源码分析
Vector的基本介绍: (1)Vector类的定义说明:我们进入源码界面进行查看: public class Vector<E>extends AbstractList<E> ...
- ArrayList底层源码分析
声明:本文为作者原创,请勿装载,如过转载,请注明转载地址 文章目录 ArrayList底层源码分析 1. 继承Serializable接口 2. 继承Cloneable接口 2.1 浅拷贝 2.2 深 ...
- 【mybatis源码】 mybatis底层源码分析
[mybatis源码] mybatis底层源码分析 1.测试用例 2.开撸源码 2.1 SqlSessionFactory对象的创建与获取 2.2 获取SqlSession对象 2.3 获取接口的代理 ...
最新文章
- python函数模块概念_python中模块和包的概念
- 枚举方式的线程安全的单例
- 分布式与人工智能课程(part10)--图像库的基本使用
- delphi 调用php接口_爱站权重查询 API 接口请求调用
- 自称迪拜十星级酒店,震撼了!
- 【数学】MORE XOR
- PostgreSQL体系结构和基本操作
- DataGridView的DataGridViewComboBoxColumn列点击后触发其他方法
- win7修复office图标显示不正确
- outlook 发送邮件
- Bongo Cat 小猫咪自制全键盘版本 养一只超可爱的小猫
- php 一键wifi,懒人全自动脚本,一键自动swap2c一键3d加速,一键wifi加速等等.doc
- linux用户修改和密码管理
- 商人渡河问题(MATLAB版)
- 窗口管理工具:HazeOver for Mac
- 一个操作失误,阿里云大规模故障,引发大量吐槽
- Hibernate安装教程
- 天翼云 杭州 云主机(VPS) 性能评测
- 【C语言】字符串的拷贝
- 【计算机体系结构】计算机系统结构的基本概念——基本知识要点汇总
热门文章
- 程序员复工后被裁,600万房21000房贷无力偿还,给年轻人3点忠告
- 三分钟搭建开源的工单系统ferry
- 从“触点”到“旅程”——浅谈数字时代的客户体验提升
- CREAL CEO:AR/VR动态变焦有哪几种解决方案?
- JS生成随机字符,生成一堆高逼格的乱码。。。
- 高效办公 1.2 用Python新建Excel文件
- 华为杭州研究所面试记
- C# SolidWorks 二次开发 API --- 2018版 中文翻译 之官方示例
- 将Excel表格中的文本格式存储的数字批量转换为数字
- 虚拟机是什么?有什么用