2019年5月13日 星期一

7天學會設計模式 CHAP07 裝飾者模式 Decorator

7天學會設計模式
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
**/