设计模式课程 设计模式精讲 9-2 原型模式coding
1 课堂演练
1.1 super.toString 作用
1.2 为什么要使用克隆方法呢
2 代码解析
2.1 代码解析1(使用原型模式之前)
2.2 代码解析2(使用原型模式默认方式(浅克隆))
2.3 代码解析3(一种常用原型模式)
2.4 代码解析4(浅克隆的弊端)
2.5 代码解析5(深克隆实现)
1 课堂演练
1.1 super.toString 作用
打印出对象的内存地址
1.2 为什么要使用克隆方法呢
有一些场景需要继续使用这个对象,只不过咱们简化了一些。其实这个场景,一直用同一个对象也可以,但是不符合面向对象的写法。一个对象和另外一个对象尽量独立存在
2 代码解析
2.1 代码解析1(使用原型模式之前)
需求:
邮件类:
package com.geely.design.pattern.creational.prototype; public class Mail {
private String name;
private String emailAddress;
private String content; /**
* 1 添加初始化方法,目的是为了一会儿和克隆方法 出来的对象,作对比。
* 查看克隆出来的对象是否是此初始化出来的。
*/
public Mail(){
System.out.println("Mail Class Constructor");
} /**
* 2 为打印方便,添加toString方法
* @return
*/
@Override
public String toString() {
return "Mail{" +
"name='" + name + '\'' +
", emailAddress='" + emailAddress + '\'' +
", content='" + content + '\'' +
'}';
} /**
* 3 以下是get和set方法
* @return
*/
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEmailAddress() {
return emailAddress;
} public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}
邮件工具类:
package com.geely.design.pattern.creational.prototype; import java.text.MessageFormat; /**
* 邮件工具类,实现发送邮件和保存邮件初始化模版的功能
*/
public class MailUtil { /**
* 1 发送邮件功能的实现
* 重点: 占位符赋值的实现
* @param mail
*/
public static void sendMail(Mail mail){
String sOutPutContent = "向{0}同学发送邮件内容为{1},邮件地址为:{2}";
System.out.println(MessageFormat.format(sOutPutContent,mail.getName(),mail.getContent(),mail.getEmailAddress()));
} /**
* 2 保存日志记录
*/
public static void saveOriginMail(Mail mail){
System.out.println("邮件内容为"+mail.getContent());
}
}
测试类:
package com.geely.design.pattern.creational.prototype; /**
* 测试类:
*/
public class Test { /**
* 1 测试使用原型模式(克隆之前)
* @param args
*/
public static void main(String [] args){
Mail mail = new Mail();
mail.setContent("初始化模版"); for(int i = 0;i < 10;i++){
mail.setName("姓名"+i);
mail.setContent("内容"+i);
mail.setEmailAddress(i+"@imooc.com");
MailUtil.sendMail(mail);
}
MailUtil.saveOriginMail(mail);
} }
打印日志:
Mail Class Constructor
向姓名0同学发送邮件内容为内容0,邮件地址为:0@imooc.com
向姓名1同学发送邮件内容为内容1,邮件地址为:1@imooc.com
向姓名2同学发送邮件内容为内容2,邮件地址为:2@imooc.com
向姓名3同学发送邮件内容为内容3,邮件地址为:3@imooc.com
向姓名4同学发送邮件内容为内容4,邮件地址为:4@imooc.com
向姓名5同学发送邮件内容为内容5,邮件地址为:5@imooc.com
向姓名6同学发送邮件内容为内容6,邮件地址为:6@imooc.com
向姓名7同学发送邮件内容为内容7,邮件地址为:7@imooc.com
向姓名8同学发送邮件内容为内容8,邮件地址为:8@imooc.com
向姓名9同学发送邮件内容为内容9,邮件地址为:9@imooc.com
邮件内容为内容9 Process finished with exit code 0
2.2 代码解析2(使用原型模式默认方式(浅克隆))
邮件类:
package com.geely.design.pattern.creational.prototype;
/*
* 只有实现clonable接口,才能调用clone方法
*/
public class Mail implements Cloneable{
private String name;
private String emailAddress;
private String content; /**
* 4 添加浅克隆方法
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("调用克隆方法");
return super.clone();
} /**
* 1 添加初始化方法,目的是为了一会儿和克隆方法 出来的对象,作对比。
* 查看克隆出来的对象是否是此初始化出来的。
*/
public Mail(){
System.out.println("Mail Class Constructor");
} /**
* 2 为打印方便,添加toString方法
* 添加super.toString方法是为了打印内存地址,比较克隆的对象内存地址和初始化的对象内存地址是否一致
* 以及克隆对象之间内存地址是否一致
* @return
*/
@Override
public String toString() {
return "Mail{" +
"name='" + name + '\'' +
", emailAddress='" + emailAddress + '\'' +
", content='" + content + '\'' +
'}'+super.toString();
} /**
* 3 以下是get和set方法
* @return
*/
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEmailAddress() {
return emailAddress;
} public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}
邮件工具类:
package com.geely.design.pattern.creational.prototype; import java.text.MessageFormat; /**
* 邮件工具类,实现发送邮件和保存邮件初始化模版的功能
*/
public class MailUtil { /**
* 1 发送邮件功能的实现
* 重点: 占位符赋值的实现
* @param mail
*/
public static void sendMail(Mail mail){
String sOutPutContent = "向{0}同学发送邮件内容为{1},邮件地址为:{2}";
System.out.println(MessageFormat.format(sOutPutContent,mail.getName(),mail.getContent(),mail.getEmailAddress()));
} /**
* 2 保存日志记录
*/
public static void saveOriginMail(Mail mail){
System.out.println("邮件内容为"+mail.getContent()+mail.getContent());
}
}
测试类:
package com.geely.design.pattern.creational.prototype; /**
* 测试类:
*/
public class Test { /**
* 1 测试使用原型模式(克隆之前)
* @param args
*/
public static void main(String [] args) throws CloneNotSupportedException {
Mail mail = new Mail();
mail.setContent("初始化模版");
System.out.println("初始化对象内存地址"+mail); for(int i = 0;i < 10;i++){
Mail mailTemp = (Mail) mail.clone();
mailTemp.setName("姓名"+i);
mailTemp.setContent("内容"+i);
mailTemp.setEmailAddress(i+"@imooc.com");
MailUtil.sendMail(mailTemp);
System.out.println("克隆对象"+i+"内存地址"+mailTemp);
}
MailUtil.saveOriginMail(mail);
} }
打印日志:
"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=3318:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes" com.geely.design.pattern.creational.prototype.Test
Mail Class Constructor
初始化对象内存地址Mail{name='null', emailAddress='null', content='初始化模版'}com.geely.design.pattern.creational.prototype.Mail@52a7b7ff
调用克隆方法
向姓名0同学发送邮件内容为内容0,邮件地址为:0@imooc.com
克隆对象0内存地址Mail{name='姓名0', emailAddress='0@imooc.com', content='内容0'}com.geely.design.pattern.creational.prototype.Mail@49164555
调用克隆方法
向姓名1同学发送邮件内容为内容1,邮件地址为:1@imooc.com
克隆对象1内存地址Mail{name='姓名1', emailAddress='1@imooc.com', content='内容1'}com.geely.design.pattern.creational.prototype.Mail@5521f4ef
调用克隆方法
向姓名2同学发送邮件内容为内容2,邮件地址为:2@imooc.com
克隆对象2内存地址Mail{name='姓名2', emailAddress='2@imooc.com', content='内容2'}com.geely.design.pattern.creational.prototype.Mail@2857a293
调用克隆方法
向姓名3同学发送邮件内容为内容3,邮件地址为:3@imooc.com
克隆对象3内存地址Mail{name='姓名3', emailAddress='3@imooc.com', content='内容3'}com.geely.design.pattern.creational.prototype.Mail@11727596
调用克隆方法
向姓名4同学发送邮件内容为内容4,邮件地址为:4@imooc.com
克隆对象4内存地址Mail{name='姓名4', emailAddress='4@imooc.com', content='内容4'}com.geely.design.pattern.creational.prototype.Mail@7185d3cc
调用克隆方法
向姓名5同学发送邮件内容为内容5,邮件地址为:5@imooc.com
克隆对象5内存地址Mail{name='姓名5', emailAddress='5@imooc.com', content='内容5'}com.geely.design.pattern.creational.prototype.Mail@914304e
调用克隆方法
向姓名6同学发送邮件内容为内容6,邮件地址为:6@imooc.com
克隆对象6内存地址Mail{name='姓名6', emailAddress='6@imooc.com', content='内容6'}com.geely.design.pattern.creational.prototype.Mail@c6f558a
调用克隆方法
向姓名7同学发送邮件内容为内容7,邮件地址为:7@imooc.com
克隆对象7内存地址Mail{name='姓名7', emailAddress='7@imooc.com', content='内容7'}com.geely.design.pattern.creational.prototype.Mail@112f8578
调用克隆方法
向姓名8同学发送邮件内容为内容8,邮件地址为:8@imooc.com
克隆对象8内存地址Mail{name='姓名8', emailAddress='8@imooc.com', content='内容8'}com.geely.design.pattern.creational.prototype.Mail@771c9fcc
调用克隆方法
向姓名9同学发送邮件内容为内容9,邮件地址为:9@imooc.com
克隆对象9内存地址Mail{name='姓名9', emailAddress='9@imooc.com', content='内容9'}com.geely.design.pattern.creational.prototype.Mail@4c0d39ac
邮件内容为初始化模版初始化模版 Process finished with exit code 0
2.3 代码解析3(一种常用原型模式)
实体类:
package com.geely.design.pattern.creational.prototype.abstractprototype; /**
* 一种常用的原型模式
* 通过抽象类来实现原型模式
*/
public abstract class A implements Cloneable{ @Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
继承类:
package com.geely.design.pattern.creational.prototype.abstractprototype; /**
* 继承A类,直接调用clone接口
*/
public class B extends A{ public static void main(String [] args){
B b = new B();
try {
b.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
System.out.println("处理异常");
}
}
}
2.4 代码解析4(浅克隆的弊端)
实现功能:
小猪佩奇1克隆出新的对象小猪佩奇2,修改佩奇1的生日,佩奇2的生日保持不变
实体类:
package com.geely.design.pattern.creational.prototype; import java.util.Date; public class Pig implements Cloneable{
private String name;
private Date birthday; /**
* 4 添加有参构造方法,方便测试类赋值
* @param name
* @param birthday
*/
public Pig(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
} /**
* 3 添加克隆方法
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
} /**
* 2 添加toString方法,方便测试
* @return
*/
@Override
public String toString() {
return "Pig{" +
"name='" + name + '\'' +
", birthday=" + birthday +super.toString()+
'}';
} /**
* 1 getset方法
* @return
*/
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
测试类:
package com.geely.design.pattern.creational.prototype; import java.util.Date; public class Test2 {
public static void main(String [] args){
try {
Date date1 = new Date();
Pig pig1 = new Pig("peiqi",date1);
Pig pig2 = (Pig) pig1.clone();
System.out.println(pig1);
System.out.println(pig2); //预期修改pig1的生日,没想到pig2的生日也改了
pig1.getBirthday().setTime(0L);
System.out.println(pig1);
System.out.println(pig2);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
System.out.println("出现异常");
}
}
}
打印日志:
"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=8024:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes" com.geely.design.pattern.creational.prototype.Test2
Pig{name='peiqi', birthday=Thu Sep 05 05:44:20 CST 2019com.geely.design.pattern.creational.prototype.Pig@1bfdfa36}
Pig{name='peiqi', birthday=Thu Sep 05 05:44:20 CST 2019com.geely.design.pattern.creational.prototype.Pig@3f35fd95}
Pig{name='peiqi', birthday=Thu Jan 01 08:00:00 CST 1970com.geely.design.pattern.creational.prototype.Pig@1bfdfa36}
Pig{name='peiqi', birthday=Thu Jan 01 08:00:00 CST 1970com.geely.design.pattern.creational.prototype.Pig@3f35fd95} Process finished with exit code 0
2.5 代码解析5(深克隆实现)
实体类:
package com.geely.design.pattern.creational.prototype; import java.util.Date; public class Pig implements Cloneable{
private String name;
private Date birthday; /**
* 4 添加有参构造方法,方便测试类赋值
* @param name
* @param birthday
*/
public Pig(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
} /**
* 3 添加克隆方法
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
Pig pig = (Pig) super.clone();
//深克隆
pig.birthday = (Date) pig.birthday.clone();
return pig;
} /**
* 2 添加toString方法,方便测试
* @return
*/
@Override
public String toString() {
return "Pig{" +
"name='" + name + '\'' +
", birthday=" + birthday +super.toString()+
'}';
} /**
* 1 getset方法
* @return
*/
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
测试类:(同2.4)
package com.geely.design.pattern.creational.prototype; import java.util.Date; public class Test2 {
public static void main(String [] args){
try {
Date date1 = new Date();
Pig pig1 = new Pig("peiqi",date1);
Pig pig2 = (Pig) pig1.clone();
System.out.println(pig1);
System.out.println(pig2); //预期修改pig1的生日,没想到pig2的生日也改了
pig1.getBirthday().setTime(0L);
System.out.println(pig1);
System.out.println(pig2);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
System.out.println("出现异常");
}
}
}
打印日志:
"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=8433:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes" com.geely.design.pattern.creational.prototype.Test2
Pig{name='peiqi', birthday=Thu Sep 05 06:02:15 CST 2019com.geely.design.pattern.creational.prototype.Pig@1bfdfa36}
Pig{name='peiqi', birthday=Thu Sep 05 06:02:15 CST 2019com.geely.design.pattern.creational.prototype.Pig@3f35fd95}
Pig{name='peiqi', birthday=Thu Jan 01 08:00:00 CST 1970com.geely.design.pattern.creational.prototype.Pig@1bfdfa36}
Pig{name='peiqi', birthday=Thu Sep 05 06:02:15 CST 2019com.geely.design.pattern.creational.prototype.Pig@3f35fd95} Process finished with exit code 0
设计模式课程 设计模式精讲 9-2 原型模式coding的更多相关文章
- 设计模式课程 设计模式精讲 13-2 享元模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...
- 设计模式课程 设计模式精讲 11-2 装饰者模式coding
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- 设计模式课程 设计模式精讲 6-2 抽象工厂coding
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...
- 设计模式课程 设计模式精讲 18-2 迭代器模式coding
1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...
- 设计模式课程 设计模式精讲 5-2 工厂方法coding
1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...
- 设计模式课程 设计模式精讲 22-2 备忘录模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 网站笔记需要存储快照,能实现回退的功能. 注意: a 设计的时候,可以分为笔记类,笔记快照类和 笔记快照管理类 三个类. ...
- 设计模式课程 设计模式精讲 2-3 UML类图讲解自上而下
1 内容简析(易错加粗) 2 uml类图展示 1 内容简析(易错加粗) 1.1 设计模式中的对象关系 依赖关系 虚线箭头 组合关系 实心菱形 聚合关系 空心菱形(想象成盘子,盛东西,盘子的多,另一方少 ...
随机推荐
- FTD vs FMC
要管理思科防火墙(ASA或Firepower),我们有两种方法: 1.FirePower Threat Defense software (FTD) 2.Firesight Management Ce ...
- 20-02-27 hive表的几个问题
1.hive表的动态分区 2.hive 表如何修改列名 3.group by 对统计指标的影响 (group by 的本质) 4.row_number 对数据的影响
- 4 中文乱码 selenium的使用
# 中文乱码 #处理中文乱码 import requests from lxml import etree from urllib import request url = 'http://pic.n ...
- DBC物品中打包物品参数设置
DBC库中添加某物品包或捆,主要修改以下这两地方: 物品DBC: Stdmode字段 填写31表示捆或包 Shape字段 表示解开后的物品,填写时需要先在你的服务端文件里面找到UnbindList ...
- Django中 from django.utils import timezone 和import datetime的区别
在现实环境中,存在多个时区,用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统,所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间上产生错误. 为解决这个此类问 ...
- 火爆微信朋友圈的Excel速成班视频课程
Excel速成班视频课程,一共有10节课,附带课件. 目录结构如下: 目录:/2020032-Excel速成班视频 [4.6G] ┣━━课件 [1.9M] ┃ ┣━━第八课Excel实用技巧12例.x ...
- Thymeleaf Tutorial 文档 中文翻译
原文档地址:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html Thymeleaf官网地址:https://www.thym ...
- POJ-1087 A Plug for UNIX (网络流)
思路 电器数1 ~ 100,附带100种接口,注意题目:You notice that some of the devices use plugs for which there is no rece ...
- Spring Boot 2.x 入门前的准备-安装 Java JDK
本章节介绍在以 window7.window10 为代表的 window 和 mac book 下安装 Java 编译和开发环境JDK 1.8,在 window 上安装 Java JDK 的步骤,本章 ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. ndarr ...