java学习之路——一个oop的打印系统

 

本人第一次写博,没什么经验,请各位大虾多多指点。

这是一个可以打印学校和教师信息的java项目。要求:输入学校信息和教师信息。根据学校出钱数不同,使用不同打印机。然后按纸张的不同,打印出信息。

源代码:

首先定义一个Information 接口。所有学校 和老师信息都是这个接口的实现。

package com.icss.myschool;

public interface Information {
 public String getInformation();
}

建立简单点的教师类

package com.icss.myschool;

public class Teacher implements Information {//实现Information接口
 private String name;//教师名
 private int age;//教师年龄
 
 public Teacher(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }
 
 public Teacher() {
  super();
 }
 
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 @Override//重写getInformation接口
 public String getInformation() {
  return "教师名:\t"+name+"年龄:\t"+age;
 }

}

再写一个学校类

package com.icss.myschool;


public class School implements Information {
 private String name;
 private String address;
 private Printer printer;//建立一个Printer的对象printer。因为在要根据学校出钱情况购买打印机。
 public School(String name, String address) {
  super();
  this.name = name;
  this.address = address;
 }
 public School() {
  super();
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
  this.address = address;
 }
 public String getInformation()
 {
  return "学校名:\t"+name+ "地址:\t"+address;
 }
 public Printer buyPrinter(int money)//简单工厂设计模式。根据一个条件,产生实例化对象: 返回的对象必须是父类引用或接口的引用。
 {
  if(money<0)//如果没有钱。那么printer返回为空。
  {
   System.out.println("快去赚钱买打印机");
   return null;
  }
  else if(money<1000)//小于1000,返回为一个彩色打印机。
  {
   printer=new ColorPrinter();
   return printer;//返回的对象必须是接口的引用!
   
  }
  else//大于1000,则表示购买的是一个激光打印机
  {
   printer=new LazerPrinter();
   return printer;//返回的对象必须是接口的引用!
  }
 }
 public void print(Information i)//打印方法,调用到了printer里面的print方法。
 {
  if(printer!=null)
  {
   printer.print(i.getInformation());
  }
  else //容错处理。如果没有钱买打印机。那么输出,打印机还没买好。 如果不做容错处理。可能出现异常!
  {
   System.out.println("打印机还没买好");
  }
 }
 
}

然后来建立一个Printer的父类。各种打印机都是该类的子类。

package com.icss.myschool;

 

public class Printer {
 private IPaper paper;//简单工厂设计模式。 因为打印机要调用到纸张。 
 public void print(String content)//打印机的打印方法。
 {
  if(getPaper()!=null)//打印必须要有纸张。
  {
   for(int i=0;i<content.length();i++)//将传入打印机的内容转化为一个一个字符。传给纸张,让纸张类进行排版。
   {
    char ch=content.charAt(i);
    paper.setForm(ch);//纸张的排版方法。
   }
   String r=paper.getContent();// 将排版完成的内容。给字符串
   System.out.println(r);  //输出
  }
  else//容错处理。
  {
   System.out.println("还没有装纸");
  }
  
 }
 public IPaper getPaper() {
  return paper;
 }
 public void setPaper(IPaper paper) {
  this.paper = paper;
 }

 
}

然后写彩色和激光打印机。

package com.icss.myschool;

public class ColorPrinter extends Printer {
 public void print(String content)
 {
  System.out.println("彩色打印机");
  super.print(content);//调用到父类中的print方法。
 }
}

 

package com.icss.myschool;

public class LazerPrinter extends Printer {
 public void print(String content)
 {
  System.out.println("激光打印");
  super.print(content);
 }
}

 

然后建立一个纸张的父类 或者接口。

package com.icss.myschool;

public interface IPaper {
 public final static String NEWLINE="\n";//换行的静态变量。
 public void  setForm(char ch);  //纸张的格式转换方法。
 public String getContent();   //转换完格式。再重新传入打印机中的方法。
}

建议一个A4纸张的类

package com.icss.myschool;

public class A4Paper implements IPaper {// 实现纸张接口
 private int charPerLine=10;   // 定义A4纸张只有一行十个字
 private int linePerPage=10;   // 定义A4纸张一页只有十行
 private int curPage=1;    //  当前页面的页数
 private int posX=0;     // 传入纸张的字符的坐标 
 private int posY=0;
 private String content="";   //创立一个字符串 来记录由打印机传入纸张需要排版的内容
 

 @Override
 public void setForm(char ch) {//重写排版方法
  //A4纸的板式是每行10个字,每页10行。设置输入之后,按排版格式打印。
  content+=ch;
  posX++;
  if(posX==charPerLine)  //当X坐标到达行尾
  {
   posY++;      
   posX=0;
   content+=NEWLINE;  // 在内容后面加入换行符
  }
  if(posY==linePerPage) //当Y坐标到达页尾
  {
   posY=0;
   content+="======================"+curPage+"=====================";//加上页脚 
   curPage++;
   content+=NEWLINE;
   content+=NEWLINE;
  
  }
 }
 public String getContent()// 对于最后一页的内容进行排版。然后将排版好的内容传回打印机。
 {
  if(posX!=0||posY!=0)// 如果打印到最后一页,并不是在最后一个字。那么要给最后一页的页脚空出位置输出
  {
   int count=linePerPage-posY-1;//计算出要空出的行数
   for(int i=0;i<count;i++ )
   {
    content+=NEWLINE;
   }
  }
  content+="======================"+curPage+"=====================";
  return content;
 }

}

整个程序基本上就写好了。 来测试一下试试。

package com.icss.myschool;

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  School s=new School("湖南科技大学湖南科技大学位居国家“两型社会”建设试点区长株潭城区枢纽、一代伟人毛泽东的故乡——湖南省湘潭市。学校起源于北宋时期兴办的湘潭县学,始建于解放前夕成立的湘北建设学院,2003年经国家教育部和湖南省人民政府批准,由湘潭工学院和湘潭师范学院两所全日制本科院校合并组建而成。60年多来,学校浸润着“敢为人先、经世致用”的湖湘文化,秉承了“为有牺牲多壮志,敢教日月换新天”的韶山精神,始终艰苦奋斗,自强不息,形成了“唯实惟新、至诚致志”的优良校风,培养了十多万名肯干、实干、能干的复合型应用性人才。","湖南湘潭");
  Teacher t=new Teacher("张三",56);//输入信息
  Printer p=s.buyPrinter(5020);//购买打印机,价格为5020
  IPaper pa=new A4Paper();   //购买A4纸张。
  p.setPaper(pa);    //将纸张放入打印机里面。 
  s.print(s);     //输出学校信息
  s.print(t);     //输入教师信息
 }

}
编译,运行的结果为

激光打印
学校名: 湖南科技大
学湖南科技大学位居国
家“两型社会”建设试
点区长株潭城区枢纽、
一代伟人毛泽东的故乡
——湖南省湘潭市。学
校起源于北宋时期兴办
的湘潭县学,始建于解
放前夕成立的湘北建设
学院,2003年经国
======================1=====================

家教育部和湖南省人民
政府批准,由湘潭工学
院和湘潭师范学院两所
全日制本科院校合并组
建而成。60年多来,
学校浸润着“敢为人先
、经世致用”的湖湘文
化,秉承了“为有牺牲
多壮志,敢教日月换新
天”的韶山精神,始终
======================2=====================

艰苦奋斗,自强不息,
形成了“唯实惟新、至
诚致志”的优良校风,
培养了十多万名肯干、
实干、能干的复合型应
用性人才。地址: 湖
南湘潭


======================3=====================
激光打印
学校名: 湖南科技大
学湖南科技大学位居国
家“两型社会”建设试
点区长株潭城区枢纽、
一代伟人毛泽东的故乡
——湖南省湘潭市。学
校起源于北宋时期兴办
的湘潭县学,始建于解
放前夕成立的湘北建设
学院,2003年经国
======================1=====================

家教育部和湖南省人民
政府批准,由湘潭工学
院和湘潭师范学院两所
全日制本科院校合并组
建而成。60年多来,
学校浸润着“敢为人先
、经世致用”的湖湘文
化,秉承了“为有牺牲
多壮志,敢教日月换新
天”的韶山精神,始终
======================2=====================

艰苦奋斗,自强不息,
形成了“唯实惟新、至
诚致志”的优良校风,
培养了十多万名肯干、
实干、能干的复合型应
用性人才。地址: 湖
南湘潭


======================3=====================

教师名: 张三年龄: 56

======================3=====================

多输出了一遍学校的信息。应该是将学校信息传入纸张的时候内容被content记录 然后教师信息传入之后并没有清空。然后用content+=将信息加入了。暂时没有想到改进的办法。希望各位给予帮助。

重新来走一遍程序:

School s=new School(......,.....);创建一个School s的引用,指向School类的对象(貌似是这么说的吧)。利用构造函数,给学校名和地址赋值。在School类里面建立一个Printer类的printer引用。

Teacher t=new Teacher("张三",56);建议一个老师的对象,名字为张三,年龄56.

Printer p=s.buyPrinter(5020);  用简单工厂模式。给p引用赋值,因为输入金额为5020大于1000,所以是用的激光打印机。输出激光打印,然后调用父类Printer的print方法。建立一个Ipaper的paper引用。

IPaper pa=new A4Paper();   //建立一个A4Paper的对象。p.setPaper(pa);将A4Paper对象放入p.setPaper()方法中。

s.print(s);调用School类中的print()方法 .用建立的printer对象调用Printer类中的print()方法。传入的内容为Information接口中的getInformation()方法。这是多态的表现。然后将学校或者老师的信息传给Printer类中的print()方法。将字符串一位一位传给Paper类中的setForm()方法。实现排版之后。用getContent()方法将排版后的内容重新传给Printer类中的一个字符串变量r,然后输出。

这个是java中一个oop的很好的例子。让我对面向对象又有了新的认识。程序的各个类和方法与现实世界的一些物体和动作都是对应的。就是要将这一些抽象出来。组成一个个“高内聚,低耦合”的类。让各自执行自己的任务。

这样设计十分灵活。如果想要将添加一个新的打印方式,直接写一个类继承Printer。输入教师和学校的信息可以直接建立一个新的引用然后引用School或者Teacher类。如果添加新的纸张类型。也只需建立一个实现IPaper的类就可以了。

学习到了一个设计模式。简单工厂:记得返回的对象要是父类或者接口的对象。感觉难点:1、框架自己写不出来。只能靠老师给的框架编程。

                   2、参数的传递太多了。内在逻辑弄得不是很彻底就会思路理不清。以后要多做着方面的练习。
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值