http://www.books.com.tw/products/0010750585
chap07
裝飾者模式 Decorator
目的:動態的將功能附加在物件上
package com.ssc24.chap07.demo01; public interface Adventurer { void attack(); }
package com.ssc24.chap07.demo01; public class Lancer implements Adventurer { private String name; public Lancer(String name) { this.name = name; } @Override public void attack() { System.out.println(" 長槍攻擊 by " + this.name); } }
package com.ssc24.chap07.demo01; public abstract class Title implements Adventurer { protected Adventurer adventure; public Title(Adventurer adventure) { this.adventure = adventure; } @Override public void attack() { adventure.attack(); } }
package com.ssc24.chap07.demo01; public class TitleAgile extends Title { public TitleAgile(Adventurer adventure) { super(adventure); } @Override public void attack() { System.out.print(" 快速 "); super.attack(); } public void useFlash() { System.out.println(" 使用瞬間移動 "); } }
package com.ssc24.chap07.demo01; public class TitleInFire extends Title { public TitleInFire(Adventurer adventure) { super(adventure); } @Override public void attack() { System.out.print(" 燃燒 "); super.attack(); } public void fireball() { System.out.println(" 丟火球 "); } }
package com.ssc24.chap07.demo01; public class TitleStrong extends Title { public TitleStrong(Adventurer adventure) { super(adventure); } @Override public void attack() { System.out.print(" 猛力 "); super.attack(); } }
package com.ssc24.chap07.demo01; import static org.junit.Assert.*; import org.junit.Test; public class TitleTest { @Test public void test() { System.out.println("===裝飾者模式==="); Adventurer lancer = new Lancer("Jacky"); System.out.println("---長槍兵 Jacky---"); lancer.attack(); System.out.println(); System.out.println("---取得強壯稱號的 Jacky---"); TitleStrong strongJacky = new TitleStrong(lancer); strongJacky.attack(); System.out.println(); System.out.println("---取得敏捷號稱的Jacky---"); TitleAgile agileJacky = new TitleAgile(strongJacky); agileJacky.attack(); agileJacky.useFlash(); System.out.println(); System.out.println("---取得燃燒號稱的Jacky---"); TitleInFire fireJacky = new TitleInFire(agileJacky); fireJacky.attack(); fireJacky.fireball(); } }
/** ===裝飾者模式=== ---長槍兵 Jacky--- 長槍攻擊 by Jacky ---取得強壯稱號的 Jacky--- 猛力 長槍攻擊 by Jacky ---取得敏捷號稱的Jacky--- 快速 猛力 長槍攻擊 by Jacky 使用瞬間移動 ---取得燃燒號稱的Jacky--- 燃燒 快速 猛力 長槍攻擊 by Jacky 丟火球 **/
package com.ssc24.chap07.demo02; import java.io.BufferedReader; import java.io.Reader; public class ReverseReader extends BufferedReader { public ReverseReader(Reader in) { super(in); } public String reverse(String source) { String result = ""; for (int i = 0;i < source.length(); i++ ) { result = source.charAt(i) + result; } return result; } }
package com.ssc24.chap07.demo02; import static org.junit.Assert.*; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.junit.Test; public class JavaIOTest { @Test public void test() throws IOException { System.out.println("===FileReader讀取檔案==="); File file = new File("D:/test.txt"); FileReader reader = new FileReader(file); int c = 0; while ((c=reader.read()) >= 0) { System.out.print((char) c); } reader.close(); System.out.println(); System.out.println("===BufferedReader讀取檔案==="); BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); String line = ""; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } bufferedReader.close(); System.out.println(); System.out.println("===Reverse Reader讀取檔案==="); ReverseReader reverseReader = new ReverseReader(new FileReader(file)); String rline = ""; while ((rline = reverseReader.reverse(reverseReader.readLine())) != null) { System.out.println(rline); } reverseReader.close(); } }
/** ===FileReader讀取檔案=== apple pen pineapple pen ===BufferedReader讀取檔案=== apple pen pineapple pen ===Reverse Reader讀取檔案=== nep elppa nep elppaenip **/