一、如何开发一个打印机

  1.可灵活配置使用彩色魔盒或灰色魔盒

  2.可灵活配置打印页面的大小

二、打印机功能的实现依赖于魔盒和纸张

三、步骤:

  1.定义墨盒和纸张的接口标准

 package cn.printer;
/**
* 墨盒接口
* @author TengYiCheng
*
*/
public interface Ink {
/**
* 定义打印采用的颜色的方法
* @param r
* @param g
* @param b
* @return 返回打印采用的颜色
*/
public String getColor(int r,int g,int b);
}
 package cn.printer;
/**
* 纸张接口
* @author TengYiCheng
*
*/
public interface Paper {
public static final String newline = "\t\n";
/**
* 输出一个字符到纸张
* @param c
*/
public void putInChar(char c);
/**
* 得到输出到纸张的内容
* @return
*/
public String getContent();
}

  2.使用接口标准开发打印机

package cn.ink;

import java.awt.Color;

import cn.printer.Ink;
/**
* 彩色墨盒。ColorInk实现Ink接口
* @author TengYiCheng
*
*/
public class ColorInk implements Ink {
//打印采用颜色
@Override
public String getColor(int r, int g, int b) {
Color color = new Color(r,g,b);
return "#"+Integer.toHexString(color.getRGB()).substring(2);
} }
package cn.ink;

import java.awt.Color;

import cn.printer.Ink;

/**
* 灰色墨盒。GreyInk实现Ink接口
* @author TengYiCheng
*
*/
public class GreyInk implements Ink {
//打印采用灰色
@Override
public String getColor(int r, int g, int b) {
int c = (r+g+b)/3;
Color color = new Color(c,c,c);
return "#"+Integer.toHexString(color.getRGB()).substring(2);
} }
package cn.ink;

import cn.printer.Paper;

public class TextPaper implements Paper {
//每行字符数
private int charPerLine = 12;
//每页行数
private int linePerPage = 10;
//纸张中内容
private String content = "";
//当前横向位置,从0到charPerLine-1
private int posX = 0;
//当前行数,从0到linePerPage-1
private int posY = 0;
//当前页数
private int posP = 1;
@Override
public void putInChar(char c) {
content += c;
posX++;
//判断是否换行
if (posX==charPerLine) {
content += Paper.newline;
posX = 0;
posY++;
}
//判断是否换页
if (posY==linePerPage) {
content += "===第"+posP+"页===";
content += Paper.newline+Paper.newline;
posY = 0;
posP++;
}
} @Override
public String getContent() {
String ret = this.content;
//补齐本页空行,并显示页码
if (!(posX==0&&posY==0)) {
int count = linePerPage-posY;
for (int i = 0; i < count; i++) {
ret += Paper.newline;
}
ret += "===第"+posP+"页===";
}
return ret;
}
//setter方法,用于注入每行的字符数
public void setCharPerLine(int charPerLine) {
this.charPerLine = charPerLine;
}
//setter方法,用于注入每页的行数
public void setLinePerPage(int linePerPage) {
this.linePerPage = linePerPage;
} }
package cn.printer;
/**
* 打印机程序
* @author TengYiCheng
*
*/
public class Printer {
//面向接口编程,而不是具体的实现类
private Ink ink = null;
private Paper paper = null;
/**
* 设置注入所需要的setter方法
* @param ink 传入墨盒参数
*/
public void setInk(Ink ink) {
this.ink = ink;
}
/**
* 设置注入所需要的setter方法
* @param paper 传入纸张参数
*/
public void setPaper(Paper paper) {
this.paper = paper;
}
/**
* 打印机打印方法
* @param str 传入打印内容
*/
public void print(String str){
//输出颜色标记
System.out.println("使用"+ink.getColor(255, 200, 0)+"颜色打印:\n");
//逐字符输出到纸张
for (int i = 0; i < str.length(); i++) {
paper.putInChar(str.charAt(i));
}
//将纸张的内容输出
System.out.println(paper.getContent());
}
}

  3.组装打印机

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/cache" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/jdbc/spring-cache.xsd"> <!-- bean definitions here -->
<!-- 通过bean元素声明需要Spring创建的实例。该实例的类型通过class属性指定,
并通过id属性为该实例指定一个名称,以便于访问 -->
<!-- 定义彩色墨盒Bean,id是colorInk -->
<bean id = "colorInk" class="cn.ink.ColorInk"/>
<!-- 定义灰色墨盒Bean,id是greyInk -->
<bean id = "greyInk" class="cn.ink.GreyInk"/>
<!-- 定义A4纸张Bean,id是a4Paper -->
<!-- 通过setCharPerLine()方法为charPerLine属性注入每行字符数 -->
<!-- 通过setLinePerPage()方法为linePerPage属性注入每页行数 -->
<bean id = "a4Paper" class="cn.ink.TextPaper">
<property name="charPerLine" value="10"/>
<property name="linePerPage" value="8"/>
</bean>
<!-- 定义B5纸张Bean,id是b5Paper -->
<bean id = "b5Paper" class="cn.ink.TextPaper">
<property name="charPerLine" value="8"/>
<property name="linePerPage" value="6"/>
</bean>
<!-- 组装打印机。定义打印机Bean,该Bean的id是printer,class指定该Bean实例的实现类 -->
<bean id = "printer" class="cn.printer.Printer">
<!-- 通过ref属性注入已经定义好的bean -->
<!-- 注入彩色墨盒 -->
<property name="ink" ref="colorInk"/>
<!-- 注入B5打印纸张 -->
<property name="paper" ref="b5Paper"/>
</bean>
</beans>

  4.运行打印机

package cn.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.printer.Printer; /**
* 测试打印机
* @author TengYiCheng
*
*/
public class PrinterTest {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过Printer bean的id来获取Printer实例
Printer printer = (Printer)context.getBean("printer");
String content = "在本格男士的公司里,有一条明显的阶级分界线。一边是设计师傅们,一水儿的顶配大屏幕苹果机,夹杂着零星几台顶配苹果笔记本另一边是编辑和运营师傅们,一水儿的集成显卡普通笔记本电脑,不时有人抱怨内存硬盘不够大。其实现在大多数男士都会把工作电脑和娱乐电脑分开,因为需求完全不同。本司有几位科技发烧友,愿意花几万块攒一台电脑放家里玩游戏,但在公司,笔记本电脑就像学生手中的书和笔一样,每天要花10个小时以上的时间对着它,还经常要随身携带见客户或者出差,轻,薄,耐用,电量足才是重点。";
printer.print(content);
} }

Spring学习笔记:Spring动态组装打印机的更多相关文章

  1. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  2. Spring学习笔记--Spring IOC

    沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...

  3. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  4. Spring学习笔记--Spring配置文件和依赖注入

    Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...

  5. Spring学习笔记——Spring中的BeanFactory与FactoryBean

    BeanFactory BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范.他的实现类有D ...

  6. Spring学习笔记--Spring简介

    1.spring:给软件行业带来了春天; 2.spring的理念:spring框架的初衷是使的现有的更加实用,spring不是创造轮子(技术或框架),而是使现有的轮子更好的运转;spring本身是一个 ...

  7. Spring学习笔记——Spring依赖注入原理分析

    我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...

  8. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  9. 转:Spring学习笔记---Spring Security登录页

    转:http://axuebin.com/blog/2016/06/21/spring-security/?utm_source=tuicool&utm_medium=referral. 提示 ...

  10. Spring学习笔记——Spring中lazy-init与abstract具体解释

    Spring的懒载入的作用是为了避免无谓的性能开销,就是当真正须要数据的时候才去运行数据的载入操作.不只在Spring中.我们在实际的编码过程中也应该借鉴这种思想,来提高我们程序的效率. 首先我们看一 ...

随机推荐

  1. kvm虚拟化之kvm虚拟机快照备份

    kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持镜像,zlib磁盘压缩,AES加密等.   要使用镜像功能,磁盘格式必须为qcow2.下面开始kvm ...

  2. “全栈2019”Java第二十三章:流程控制语句中决策语句switch上篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. 各大SRC中的CSRF技巧

    本文作者:i春秋签约作家——Max. 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/ses ...

  4. 使用 echart的jar包,传递到前台报 null错误

    表现:后台创建 Option的JsonObjject传递到前台之后,失败,F12控制台报错:无法定义null的属性xxx 原因:使用jar包里面的对象分装没有默认值,而我们自己使用时只是对需要的对象进 ...

  5. 【转】MVC,MVP 和 MVVM 的图示

    复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP ...

  6. struts2后台向前台传值为空

    今天遇到了一个bug,在后台定义了一个list,然后在前台展示,结果前台接手到的一直是个空,然后找了半天最后才知道是名字名字的问题,这个变量是第一个字母小写,然后第二个字母大写了,然后自动生成的get ...

  7. [SCOI2018]游泳池(计算几何+分数规划+最大权闭合子图)

    题目链接 https://www.luogu.org/problemnew/show/U56187 注:题面参考了网上的其他博客,并非原题题面,因此数据范围可能有误.数据为原创数据. 题解 其实就是许 ...

  8. putty访问虚拟机

    从宿主机中用putty连接虚拟机中的Ubuntu Server. putty默认使用ssh方式连接,这需要在Ubuntu Server中安装ssh服务.使用命令sudo apt-get install ...

  9. 理解session和cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...

  10. 前端emmet插件的一些常用用法

    以下是在webstorm中简单使用emmet插件,注意一点就是当编写完emmet命令后一定要把光标移动到命令的结尾处,不然生成的代码会不一样 <!DOCTYPE html> <htm ...