Chapter 2. Adapter : 필요한 형태로 수정해서 재활용한다

sua·2022년 4월 9일
0
post-thumbnail

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();
        }
    }
}
profile
가보자고

0개의 댓글

관련 채용 정보