分析:
程式中包括印表機(Printer)、墨盒(Ink)、和紙張(Paper)、三類元件
首先建立一個新專案檔案Spring_Box
我們來定義墨盒和紙張的介面類
墨盒介面Ink.java檔案內容如下:
package entiey; public interface Ink { /** * 定義列印採用的顏色的方法 * r(紅色) * g(綠色) * b(藍色) */ public String getColor(int r,int g,int b); }
紙張介面Paper.java檔案內容如下:
package entiey; public interface Paper { /** * 紙張介面 */ public static final String newine="\r\n"; //輸入一個字元到紙張 public void putInChar(char c); //得到輸出到紙張上的內容 public String getContent(); }
這時候我們建立一個printer包名來寫Printer程式:
package printer; import entiey.Ink; import entiey.Paper; /** * 印表機程式 * @author ASUS * */ public class Printer { //面向介面程式設計,而不是具體的實現類 private Ink ink=null; private Paper paper=null; /** * 設定注入所需的setter方法 */ public void setInk(Ink ink) { this.ink = ink; } public void setPaper(Paper paper) { this.paper = paper; } /** * 設定印表機列印方法 */ 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.print(paper.getContent()); } }
然後我們開始實現墨盒(Ink)和紙張(Paper)的介面實現類
ColorInk.java檔案內容如下:
package entiey; import java.awt.Color; public class ColorInk implements Ink{ //列印採用彩色 /** * 彩色墨盒,ColorInk實現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); } }
GreyInk.java檔案內容如下:
package entiey; import java.awt.Color; public class GreyInk implements Ink{ /** * 灰色墨盒,GreyInk實現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); } }
TextPaper.java檔案內容如下:
package entiey; public class TextPaper implements Paper{ //每行字元數 private int charPerLine=16; //每頁行數 private int linePerPage=5; //紙張中的內容 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.newine; posX=0; ++posY; } //判斷是否翻頁 if(posY==linePerPage) { content+="==第"+posP+"頁=="; content+=Paper.newine+Paper.newine; 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.newine; } ret+="==第"+posP+"頁=="; } return ret; } //setter方法 public void setCharPerLine(int charPerLine) { this.charPerLine = charPerLine; } public void setLinePerPage(int linePerPage) { this.linePerPage = linePerPage; } }
開始配置XML檔案applicationContext.xml檔案內容如下:
<?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-3.2.xsd"> <!-- 定義彩色墨盒Bean,id是ColorInk --> <bean id="colorInk" class="entiey.ColorInk"/> <!-- 定義灰色墨盒Bean,id是GreyInk --> <bean id="greyInk" class="entiey.GreyInk"/> <!-- 定義A4紙張Bean,id是a4Paper --> <!-- 通過setCharPerLine()方法為charPerLine屬性注入每行字元數 --> <!-- 通過setLinePerPage()方法為linePerPage屬性注入每頁行數 --> <bean id="a4Paper" class="entiey.TextPaper"> <property name="charPerLine" value="10"/> <property name="linePerPage" value="8"/> </bean> <!-- 定義B5紙張Bean,id是b5Paper --> <bean id="b5Paper" class="entiey.TextPaper"> <property name="charPerLine" value="6"/> <property name="linePerPage" value="5"/> </bean> <!-- 組裝印表機,定義印表機Bean該Bean的id是printer.class指定該Bean例項的實現類 --> <bean id="printer" class="printer.Printer"> <!-- 通過ref屬性注入已經定義好的Bean --> <!-- 注入彩色墨盒 --> <property name="ink" ref="colorInk"/> <!-- 注入灰色墨盒 --> <property name="paper" ref="b5Paper"/> </bean> </beans>
最後我們通過測試類測試我們的程式碼執行結果如何
建立test包
testa.java檔案內容如下:
package test;
/**
* 測試印表機
* @author ASUS
*
*/
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import printer.Printer;
public class testa {
@Test
public void m1() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//通過Printer bean的id來獲取Printer例項
Printer printer=(Printer) context.getBean("printer");
String content="欸 朋友們好啊" +
"我是渾元形意太極門掌門人馬保國" +
"剛才有個朋友問我" +
"馬老師發生什麼事啦" +
"我說怎麼回事" +
"給我發了幾張截圖"
+"我一看" +
"哦" +
"原來是昨天 "+
"有兩個年輕人" +
"三十多歲" +
"一個體重九十多公斤" +
"一個體重八十多公斤" +
"他們說" +
"欸" +
"有一個說是" +
"我在健身房練功" +
"頸椎練壞了" +
"馬老師你能不能教教我渾元功法" +
"欸" +
"幫助治療一下我的頸椎病" +
"我說可以" +
"我說你在健身房練死勁兒不好用" +
"他不服氣" +
"欸" +
"我說小朋友" +
"你兩個手來折我一個手指頭" +
"他折不動" +
"他說你這也沒用" +
"我說我這有用" +
"這是化勁兒" +
"傳統功夫是講化勁兒的" +
"四兩撥千斤" +
"二百多斤的英國大力士" +
"都握不動我這一個手指" +
"他說要和我試試" +
"我說可以" +
"欸" +
"我一說他啪一下就站起來了" +
"很快啊" +
"然後上來就是" +
"一個左正蹬" +
"一個右鞭腿" +
"一個左刺拳" +
"我全部防出去了啊" +
"防出去以後自然是" +
"傳統功夫以點到為" +
"右拳放在他鼻子上" +
"沒打他" +
"我笑一下" +
"準備收拳" +
"因為這時間" +
"按照傳統功夫的點到為止" +
"他就輸了" +
"如果我這一拳發力" +
"一拳就把他鼻子打骨" +
"放在他鼻子上沒用打他" +
"他也承認" +
"我先打到他面部" +
"他不知道拳放在他鼻子上" +
"他承認我先打到他面部啊" +
"我收拳的時間不打了" +
"他突然襲擊左刺拳來打我臉" +
"啊" +
"我大意了啊" +
"沒有閃" +
"欸" +
"他的左拳給我眼" +
"給我右眼蹭了一下" +
"但沒關係啊" +
"他也說" +
"他結束也說了" +
"兩分多鐘以後" +
"當時流眼淚了捂著眼" +
"我說停停" +
"然後兩分鐘以後" +
"兩分多鐘以後" +
"就好了" +
"我說小夥子你不講武德你不懂" +
"他說馬老師對不起對不起" +
"我不懂規矩" +
"啊" +
"我是" +
"他說他是亂打的" +
"他可不是亂打的啊" +
"正蹬" +
"鞭腿" +
"左刺拳" +
"訓練有素" +
"後來他說他練過三四年泰拳啊" +
"看來是有備而來" +
"這兩個年輕人" +
"不講武德" +
"來" +
"騙" +
"來" +
"偷襲" +
"我69歲" +
"老同志" +
"這好嗎" +
"這不好" +
"我勸" +
"這位" +
"年輕人" +
"好自為之" +
"好好反思" +
"不要再犯這樣的聰明" +
"小聰明" +
"啊" +
"額" +
"武林要以和為貴" +
"要講武德" +
"不要搞" +
"窩裡鬥" +
"謝謝朋友們";
printer.print(content);
}
}
我們來看看我們的執行結果如下: