1. 예제 프로그램(1) - 상속을 이용한 것
<Banner.java>
package ch02.Sample1;
// 이미 존재하는 클래스(220v)
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("[" + string + "]");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
<Print.java>
package ch02.Sample1;
// Main(client) 이 필요로하는 메소드가 선언되어 있음
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
<PrintBanner.java>
package ch02.Sample1;
//어댑터
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen(); //Banner가 일을 실제로 함
}
@Override
public void printStrong() {
showWithAster(); //Banner가 일을 실제로 함
}
}
<Main.java>
package ch02.Sample1;
//클라이언트, 노트북
public class Main {
public static void main(String[] args) {
//어댑터 생성
//PrintBanner p = new PrintBanner("김");
Print p = new PrintBanner("김");//좀 더 일반적, 더 유연함
p.printWeak();
p.printStrong();
}
}
2. 예제 프로그램(2) - 위임을 이용한 것
<Banner.java>
package ch02.Sample1;
// 이미 존재하는 클래스(220v)
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("[" + string + "]");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
<Print.java>
package ch02.Sample1;
// Main(client) 이 필요로하는 메소드가 선언되어 있음
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
<PrintBanner.java>
package ch02.Sample1;
//어댑터
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen(); //Banner가 일을 실제로 함
}
@Override
public void printStrong() {
showWithAster(); //Banner가 일을 실제로 함
}
}
<Main.java>
package ch02.Sample1;
//클라이언트, 노트북
public class Main {
public static void main(String[] args) {
//어댑터 생성
//PrintBanner p = new PrintBanner("김");
Print p = new PrintBanner("김");//좀 더 일반적, 더 유연함
p.printWeak();
p.printStrong();
}
}
2. 예제 프로그램(2) - 위임을 이용한 것
<Banner.java>
package ch02.Sample2;
// 이미 존재하는 클래스(220v)
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("[" + string + "]");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
<Print.java>
package ch02.Sample2;
// Main(client) 이 필요로하는 메소드가 선언되어 있음
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
<PrintBanner.java>
package ch02.Sample2;
//어댑터
public class PrintBanner extends Print {
private Banner banner; //Banner 객체를 포함
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen(); //Banner가 일을 실제로 함
}
@Override
public void printStrong() {
banner.showWithAster(); //Banner가 일을 실제로 함(위임)
}
}
<Main.java>
package ch02.Sample2;
//클라이언트, 노트북
public class Main {
public static void main(String[] args) {
//어댑터 생성
//PrintBanner p = new PrintBanner("김");
Print p = new PrintBanner("김");//좀 더 일반적, 더 유연함
p.printWeak();
p.printStrong();
}
}
2. 연습문제 - 어댑터 FileProperties : Properties 상속, FileIO 구현
<FileIO.java>
package ch02.A2;
import java.io.*;
// Main(client)가 필요로하는 메소드
public interface FileIO {
public void readFromFile(String filename) throws IOException;
public void writeToFile(String filename) throws IOException;
public void setValue(String key, String value);
public String getValue(String key);
}
<FileProperties.java>
package ch02.A2;
import java.io.*;
import java.util.*;
// Properties 클래스는, 이미 존재하는 클래스이다.
// FileProperties 클래스가 어댑터 역할을 한다.
public class FileProperties extends Properties implements FileIO {
public void readFromFile(String filename) throws IOException {
load(new FileInputStream(filename));
}
public void writeToFile(String filename) throws IOException {
store(new FileOutputStream(filename), "written by FileProperties");
}
public void setValue(String key, String value) {
setProperty(key, value); // 상속받은 Properties 클래스의 메소드를 호출한다.
}
public String getValue(String key) {
return getProperty(key, ""); // 상속받은 Properties 클래스의 메소드를 호출한다.
}
}
<Main.java>
package ch02.A2;
import java.io.*;
public class Main {
public static void main(String[] args) {
FileIO f = new FileProperties();
try {
f.readFromFile("file.txt");
f.setValue("year2", "2000");
f.setValue("month", "11");
f.setValue("day", "20");
f.writeToFile("newfile.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
}