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. tp5 rewrite nginx 配置

    今天弄了个别人的项目,用的tp5,正好前段时间学tp5了,可是人家竟然用了rewrite,我没学过啊,放在nginx ,全是404,真尴尬 其实很简单,在配置文件里面添加一小段代码就ok了 时间紧张直 ...

  2. collections模块、时间模块、random模块、os模块、sys模块、序列化模块、subprocess模块

    一.collections模块 1.其他数据类型 在内置数据类型(str.dict.list.tuple.set)的基础上,collections模块还提供了了几个额外的数据类型:Counter.de ...

  3. java篇 之 继承

    this代表正在使用类的对象(的引用) java支持重载:允许在同一个类中使用相同的方法名(重载类型只区分参数列表,包括参数 顺序,参数个数,参数数据类型,与方法返回类型无关) 匹配: 方法名 参数列 ...

  4. Dirjkstra

    Description 给定n个点,m条有向边 求每个点到1号点的最短距离 Input 第一行两个数为n,m,n表示顶点个数,m表示边的条数. (1 ≤ n, m ≤ 100 ) 接下来m行,每一行有 ...

  5. 极简的js点击组图切换效果

    程序员进行前端开发时,时常要用到点击切换组图的动画效果,网上确实有很多此类插件,但是都很麻烦,乌糟糟无数代码,有那个看的时间,自己都能把功能写完了.在这里我提供一段极简的js点击组图切换效果代码,包含 ...

  6. 消息队列(四)--- RocketMQ-消息发送2

    概述   接着我们上一篇继续分析消息发送,上节讲到消息发送前有可能遇到 broker 失效的情况,RocketMQ 主要是采用两种策略 : 重试发送 broker 故障延迟机制   后者指的是当发送给 ...

  7. php集成环境、基础标记符

    集成环境:wamp windows apache mysql php lamp linux apache mysql php 标记符: 1.<?php ...... ?> 2.<?p ...

  8. 黑帽JS跳转

    一.常规的JS页面跳转代码 .在原来的窗体中直接跳转用 <script type=”text/javascript”> window.location.href=”http://www.g ...

  9. C语言:找出一个大于给定整数m且紧随m的素数,-求出能整除x且不是偶数的数的个数,

    //函数fun功能:找出一个大于给定整数m且紧随m的素数,并作为函数值返回. #include <stdlib.h> #include <conio.h> #include & ...

  10. SpringBoot 系列

    https://my.oschina.net/xiedeshou?tab=newest&catalogId=5936801 SpringBoot | 第零章:前言 SpringBoot | 第 ...