当前位置:   article > 正文

设计模式,模板方法模式、原型模式

设计模式,模板方法模式、原型模式

模板方法模式

模板方法模式,就是将一些具体层都会有重复的内容,都放在抽象层作为具体层的模板,让具体层的代码能更简洁,也更好地实现代码复用。

代码实现

若有一套试卷,有A和B两个学生来作答,其中的题目便就是A、B都不用自己去写的东西,即可以作为模板的东西。

空试卷:

  1. /**
  2. * 模板方法模式
  3. */
  4. public class Paper {
  5. public void question1(String answer){
  6. System.out.println("中国的国宝动物是啥?");
  7. System.out.println(answer);
  8. }
  9. public void question2(String answer){
  10. System.out.println("海绵宝宝的住所叫什么?");
  11. System.out.println(answer);
  12. }
  13. //答题卡
  14. public void answerCard(String answer1,String answer2){
  15. this.question1(answer1);
  16. this.question2(answer2);
  17. }
  18. }

学生作答的试卷:

  1. public class StudentAPaper extends Paper {
  2. public void finishPaper(){
  3. this.answerCard("熊猫","菠萝屋");
  4. }
  5. }
  1. public class StudentBPaper extends Paper {
  2. public void finishPaper(){
  3. this.answerCard("熊猫","狼堡");
  4. }
  5. }

业务代码:

  1. StudentAPaper paperA = new StudentAPaper();
  2. StudentBPaper paperB = new StudentBPaper();
  3. paperA.finishPaper();
  4. System.out.println();
  5. paperB.finishPaper();

运行结果为:

中国的国宝动物是啥?
熊猫
海绵宝宝的住所叫什么?
菠萝屋

中国的国宝动物是啥?
熊猫
海绵宝宝的住所叫什么?
狼堡

 像题目这种无需让两个学生抄题的可以复用的东西,便可以放在他们共同的父类中,此时题目就是提供给两个学生做题的模板。像这种将可以复用的代码放在抽象层,使得具体层在实现的时候能直接复用这个模板,就是使用了模板方法模式。

原型模式

让一个类实现cloneable接口并实现其clone方法,使得要复制此类的对象,只要调用其clone方法即可,这种使得对象的复制更方便的模式就是原型模式

代码实现

若学生的信息表有时要进行复制:

  1. public class Information implements Cloneable{
  2. private String name;
  3. private String classes;
  4. private String id;
  5. //省略一些不重要代码……
  6. public Information clone(){
  7. Information paper = null;
  8. try {
  9. paper = (Information) super.clone();
  10. } catch (CloneNotSupportedException e) {
  11. e.getMessage();
  12. }
  13. return paper;
  14. }
  15. }

当要对其类的对象进行复制,也就是要对学生信息进行复制,直接调用其clone方法即可。

但是这种只是浅复制,如果学生信息中加了一个School类型的对象,就是学校信息,调用clone方法便只会复制其地址,即新的对象和原来的对象用的是同一个School对象的信息。

要进行深复制,即新复制的对象用的School对象是一个新的对象,则要保证被引用的数据的类型也实现了cloneable接口实现了clone方法。

School类:

  1. public class School implements Cloneable{
  2. private String name;
  3. private String address;
  4. //省略一些不重要的代码……
  5. public School clone(){
  6. School school = null;
  7. try {
  8. school = (School) super.clone();
  9. } catch (CloneNotSupportedException e) {
  10. e.getMessage();
  11. }
  12. return school;
  13. }
  14. }

新的Information类:

  1. public class Information implements Cloneable{
  2. private String name;
  3. private String classes;
  4. private String id;
  5. private School school;
  6. //省略一些不重要的代码……
  7. public Information clone(){
  8. Information paper = null;
  9. try {
  10. paper = (Information) super.clone();
  11. paper.school = this.school.clone();
  12. } catch (CloneNotSupportedException e) {
  13. e.getMessage();
  14. }
  15. return paper;
  16. }
  17. }

如果要更深层次的深复制,比如School类中又有其他类型的引用类型的数据,以此类推,在clone方法中调用其对应的深层次的clone方法即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/425137
推荐阅读
相关标签
  

闽ICP备14008679号