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的更多相关文章

  1. 设计模式课程 设计模式精讲 13-2 享元模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...

  2. 设计模式课程 设计模式精讲 11-2 装饰者模式coding

    1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...

  3. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  4. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  5. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

  6. 设计模式课程 设计模式精讲 18-2 迭代器模式coding

    1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...

  7. 设计模式课程 设计模式精讲 5-2 工厂方法coding

    1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...

  8. 设计模式课程 设计模式精讲 22-2 备忘录模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 网站笔记需要存储快照,能实现回退的功能. 注意: a 设计的时候,可以分为笔记类,笔记快照类和 笔记快照管理类  三个类. ...

  9. 设计模式课程 设计模式精讲 2-3 UML类图讲解自上而下

    1 内容简析(易错加粗) 2 uml类图展示 1 内容简析(易错加粗) 1.1 设计模式中的对象关系 依赖关系 虚线箭头 组合关系 实心菱形 聚合关系 空心菱形(想象成盘子,盛东西,盘子的多,另一方少 ...

随机推荐

  1. Genetic Algorithm 资源

    算法源码: NeuralGenetic : https://github.com/ahmedfgad/NeuralGenetic evolving-simple-organisms : https:/ ...

  2. AFNetworking errorCode -1016 解决方法

    AFNetworking 默认是只能解析以下格式,如果需要支持data等格式,需要增加acceptableContentTypes AFNetworking.acceptableContentType ...

  3. package.json中的script选项作用

    npm不仅可以用于模块管理,还可以用于执行脚本.package.json文件有一个scripts字段,可以用于指定脚本命令,供npm直接调用. 接下来做个简单测试: (1)在项目根目录下创建demo. ...

  4. [JLOI2009]神秘的生物

    题目链接 题目大意 给定一个\(n*n\)的矩阵,从其中选取恰好一个连通块,使选取的格子所对应的权值和最大. \(n\leq 9\) 解题思路 由于\(n\)特别小,考虑插头dp. 和一般的插头dp不 ...

  5. 移动端,ajax 动态加载的元素,为动态添加的一系列同个类名的元素添加点击事件

    背景:一个列表页,有一系列同类名的元素,需要为每一个动态添加的列表项添加事件: 点击选择下图中不同的文档类型,再通过 ajax 动态加载不同的文档. 使用过的方法: 1.通知 jquery 的 $(s ...

  6. 《JavaScript高级程序设计》读书笔记(三)基本概念第六小节理解函数

    内容---语法---数据类型---流程控制语句 上一小节---理解函数 本小节 函数--使用function关键字声明,后跟一组参数以及函数体 function functionName(arg0, ...

  7. [CISCN2019 华北赛区 Day1 Web1]Dropbox

    0x01 前言 通常我们在利用反序列化漏洞的时候,只能将序列化后的字符串传入unserialize(),随着代码安全性越来越高,利用难度也越来越大.但在不久前的Black Hat上,安全研究员Sam ...

  8. pacman 包管理器相关设定

    pacman 包管理器相关设定 使用国内源 sudo pacman-mirrors -i -c China -m rank 设定 archlinuxcn 源 编辑/etc/pacman.conf,末尾 ...

  9. HDU2612 Find a way (跑两遍BFS)

    Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year ...

  10. 显ipQQ

    链接:https://pan.baidu.com/s/1l1WN4b3jT8n4e66DH8d-cg 提取码:kjm4