四、实现“动态组装”打印机

一、本课目标

  • 实现“动态组装”的打印机

二、依赖注入综合实例

2.1如何开发一个打印机?

  • 可灵活配置使用彩色墨盒或灰色墨盒
  • 可灵活配置打印页面的大小

这两个灵活就是动态体现的地方。

分析:
打印机功能的实现依赖于墨盒和纸张。
步骤:
1、定义墨盒和纸张的接口标准
2、使用接口标准开发打印机
3、组装打印机
4、运行打印机

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

墨盒的接口标准

package cn.printer;

public interface Ink {
    
    /**
     * 定义打印机采用的颜色值
     * @param r 红色值
     * @param g 绿色值
     * @param b 蓝色值
     * @return 打印机采用的颜色值
     */
    public String getColor(int r, int g, int b);

    
}

墨盒的实现类:

package cn.ink;

import java.awt.Color;

import cn.printer.Ink;

/**
 * 灰色墨盒,实现ink接口
 * @author Administrator
 *
 */
public class GreyInk implements Ink {
    /**
     * 打印采用灰色
     */
    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 java.awt.Color;

import cn.printer.Ink;

public class ColorInk implements Ink{

    /**
     * 打印采用彩色
     */
    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.printer;
/**
 * 打印机采用的纸张接口
 * @author Administrator
 *
 */

public interface Paper {
    
    public static final String newLine = "\r\n";
    
    /**
     * 往纸张里面逐个字符输出内容
     * @param c
     */
    public void putInChar(char c);
    
    /**
     * 得到输出到纸张的内容
     * @return
     */
    public String getContent();
        
}

纸张的实现类

package cn.ink;

import cn.printer.Paper;

public class TextPaper implements Paper{
    // 每一行能输出的字符数
    private int charPerLine = 16;
    // 每页的行数
    private int linePerPage = 8;
    // 当前的横向位置,从0开始到charPerLine-1
    private int posx = 0;
    // 当前行号
    private int posy = 0;
    // 当前页号
    private int posp = 1;
    // 纸张中的内容
    private String content = "";
    
    
    
    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;
        }
    }

    public String getContent() {
        // 给页面加上页号
        String ret = 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方法,注入charPerLine的值
     * @param charPerLine
     */
    public void setCharPerLine(int charPerLine) {
        this.charPerLine = charPerLine;
    }
    /**
     * 设置注入所需要的setter方法,注入linePerPage的值
     * @param linePerPage
     */
    public void setLinePerPage(int linePerPage) {
        this.linePerPage = linePerPage;
    }

}

使用接口标准开发打印机

package cn.printer;

public class Printer {
    // 面向接口编程,定义Ink接口的变量
    private Ink ink;
    // 面向接口编程,定义paper接口变量
    private Paper paper;
    
    /**
     * 提供Ink的setter方法,以进行设值注入
     * @param ink
     */
    public void setInk(Ink ink) {
        this.ink = ink;
    }
    /**
     * 提供paper的setter方法,以进行设值注入
     * @param paper
     */
    public void setPaper(Paper paper) {
        this.paper = paper;
    }
    /**
     * 打印方法,查看打印采用的颜色和纸张中打印的内容
     * @param str
     */
    public void print(String str) {
        System.out.println("使用" + ink.getColor(225, 200, 0) + "颜色打印\n");
        for (int i = 0; i < str.length(); i++) {
            paper.putInChar(str.charAt(i));
        }
        System.out.println(paper.getContent());
    }
    
}

组装打印机:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 指定灰色墨盒的bean元素,该元素的id为greyInk,class属性指定要实例化的类 -->
    <bean id="greyInk" class="cn.ink.GreyInk"></bean>
    <!-- 指定彩色墨盒的bean元素,该元素的id为colorInk,class属性指定要实例化的类 -->
    <bean id="colorInk" class="cn.ink.ColorInk"></bean>
    
    
    <!-- 指定a4paper的bean元素,该元素的id为a4paper,class属性指定要实例化的类 -->
    <bean id="a4paper" class="cn.ink.TextPaper">
        <!-- property元素指定需要赋值的属性,charPerLine需要赋值,
        TextPaper类里面需要写setCharPerLine(),进行设值注入 -->
        <property name="charPerLine" value="8"></property>
        <!-- property元素指定需要赋值的属性,linePerPage需要赋值,
        TextPaper类里面需要写setlLinePerPage(),进行设值注入 -->
        <property name="linePerPage" value="6"></property>
    </bean>
    <!-- 指定b5paper的bean元素,该元素的id为b5paper,class属性指定要实例化的类 -->
    <bean id="b5paper" class="cn.ink.TextPaper">
        <!-- property元素指定需要赋值的属性,charPerLine需要赋值,
        TextPaper类里面需要写setCharPerLine(),进行设值注入 -->
        <property name="charPerLine" value="6"></property>
        <!-- property元素指定需要赋值的属性,linePerPage需要赋值,
        TextPaper类里面需要写setlLinePerPage(),进行设值注入 -->
        <property name="linePerPage" value="5"></property>
    </bean>
    
    
    
    <!-- 指定打印机的bean元素,该元素的id为printer,class属性指定要实例化的类 -->
    <bean id="printer" class="cn.printer.Printer">
        <!-- property元素指定需要赋值的属性,ink需要赋值,
        Printer类里面需要写setInk(),进行设值注入 -->
        <property name="ink" ref="greyInk"></property>
        <!-- property元素指定需要赋值的属性,paper需要赋值,
        Printer类里面需要写setPaper(),进行设值注入 -->
        <property name="paper" ref="b5paper"></property>
    </bean>
</beans>

测试打印机:

package test;

import static org.junit.Assert.*;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.printer.Printer;

public class PrinterTest {

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Printer printer = (Printer) context.getBean("printer");
        String content = "我有一句mmpasdfgsali劳动法和披萨了对方【‘安慰放到【 按时交电费【后我完全士大夫is阿道夫撒欢打发时间地方撒旦00"
                
                + "sdfljasdhi;fioID返回记录暗示欧大佛按时交路口的法律健身房的阿士大夫为就爱上对方的舒服啊圣诞节阿萨德和劳动法护师返回去"
                + "披萨底价阿发碎对方拉丝机地方哈是否打算厉害的风景就立刻短时撒旦法撒旦法是发撒旦法撒的法国大撒发放大法官的说法噶是否噶啥的";
        printer.print(content);
        
    }

}

三、小结

在上一节的HelloSpring中,也是只定义了变量who,但是这个变量的值是卫东了,是依靠配置文件注入的。这一节的Textpaper类中的charPerLine和lineperPage也可以这么做,实现不定义值,依赖xml文件注入。这一节的打印机Printer类里面,也是只定义了ink和paper接口,但是没有实例化出来对象,对象是通过set方法在xml文件中注入进来的。
所以,可以通过set方法注入变量(helloSpring)、实例对象(printer)。
还可以在xml文件中给同一个变量设置不同的注入值,从而得到不同的对象(textpaper)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355