本人第一次写博,没什么经验,请各位大虾多多指点。
这是一个可以打印学校和教师信息的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、参数的传递太多了。内在逻辑弄得不是很彻底就会思路理不清。以后要多做着方面的练习。