day23
实践题:
需求:
学院要求有学院的基本信息
学院的老师也要有基本信息
学院的打印机可以分别打印学院的基本信息和教师的基本信息
设计这样一个系统,要求要有较好的可扩展性和可维护性
package com.saas.oo1; public class College { String name; // 学院的名称String position; // 学院的位置int year; // 学院的建校时间 // 学院的打印机,将打印机与名称位置等一样,做成学院的一个属性Printer printer = new Printer(); // 学院的打印机来打印学院的信息public void printContent(College coll){// printer是打印机对象,是学院类中的一个打印机属性// 学院的打印机调用打印机的打印方法,将学院的详细信息进行打印printer.print(coll.info());} // 学院的打印机来打印教师的信息public void printContent(Teacher tea){// printer是打印机对象,是学院类中的一个打印机属性// 学院的打印机调用打印机的打印方法,将教师的详细信息进行打印printer.print(tea.info());} // 学院的信息public String info(){String detail = "name:\t" + name +"\nposition:\t" + position +"\nyear:\t" + year; return detail;} }package com.saas.oo1; public class Teacher { String name; // 教师的姓名 String major; // 教师的专业 // 教师的详细信息public String info(){String detail = "name:\t" +name + "\nmajor :\t" + major; return detail;} }package com.saas.oo1; /*** 打印机类* 打印机可以打印任何给定的内容资源*/ public class Printer { /*** 打印机能够打印指定的内容信息* @param content*/public void print(String content){System.out.println("start printting...");System.out.println(content);} }package com.saas.oo1; public class Test { public static void main(String[] args) {// 创建学院对象College coll = new College(); // 分别给学院对象的名称、位置和建校时间赋值coll.name = "xianyangzhiye";coll.position = "tongyilu";coll.year = 86; // 调用学院的打印方法打印学院的详细信息coll.printContent(coll); System.out.println("======================"); // 构建教师对象Teacher tea = new Teacher(); // 分别设置教师对象的姓名和专业信息tea.name = "wusong";tea.major = "software"; // 调用学院的打印方法打印教师的详细信息coll.printContent(tea);} }最终的执行结果如下:
start printting... name: xianyangzhiye position: tongyilu year: 86 ====================== start printting... name: wusong major : software以上的执行结果基本可以满足之前要求的前三点
对于第四点,要求系统拥有良好的可扩展性和可维护性,目前并不能实现
现在升级以上代码,对于打印机进行进一步扩展,因为打印机可能存在黑白打印或者彩色打印
修改以上的部分类:
package com.saas.oo2; /*** 打印机类* 打印机可以打印任何给定的内容资源*/ public class Printer { /*** 打印机能够打印指定的内容信息* @param content*/public void print(String content){System.out.println("start printing...");System.out.println(content);} }package com.saas.oo2; /*** 彩色打印机*/ public class ColorPrinter extends Printer{ @Overridepublic void print(String content) {System.out.println("=======color printing=========");super.print(content);} }彩色打印机继承自打印机类
package com.saas.oo2; /*** 黑白打印机*/ public class BlackPrinter extends Printer{ @Overridepublic void print(String content) {System.out.println("=======blank white printing=========");super.print(content);} }黑白打印机继承自打印机类
package com.saas.oo2; public class College { String name; // 学院的名称String position; // 学院的位置int year; // 学院的建校时间 // 学院的打印机,将打印机与名称位置等一样,做成学院的一个属性private Printer printer; public void setPrinter(Printer printer) {this.printer = printer;} // 学院的打印机来打印学院的信息public void printContent(College coll){// printer是打印机对象,是学院类中的一个打印机属性// 学院的打印机调用打印机的打印方法,将学院的详细信息进行打印printer.print(coll.info());} // 学院的打印机来打印教师的信息public void printContent(Teacher tea){// printer是打印机对象,是学院类中的一个打印机属性// 学院的打印机调用打印机的打印方法,将教师的详细信息进行打印printer.print(tea.info());} // 学院的信息public String info(){String detail = "name:\t" + name +"\nposition:\t" + position +"\nyear:\t" + year; return detail;} }将College类中的打印机属性设置为可插拔式方式实现
这种设计,非常方便,给定的任何打印机类型的对象,都将以这种打印机效果进行打印
注意:这种设计还有一个缺陷,学院和教师都有详细信息的描述,后面我们可以使用接口来进行升级改造