Interface
1. 개방폐쇄원칙
2. 단일책임원칙
3. dependency injection (의존성 주입)
서비스 클래스는 자신이 수행할 액션이 무엇인지 모른다.
사용자가 선택한 액션을 취할 뿐.
[예제1]
//어떤 클래스가 다른 클래스의 객체를 멤버로 가진다. has_a : 의존한다.
//의존할 때는 구체적인 것이 아니라 추상적인 것에 의존해야 한다.
public class InterfaceTest {
public static void main(String[] args) {
Computer com = new Computer();
com.setKeyboard(new LKeyboard());
com.setMouse(new SMouse());
com.boot();
}
}
/////////////////////////////컴퓨터
class Computer{
// 내부에서 new 를 하면 키보드나 마우스가 바뀔 때마다 내부를 수정해야 하므로.
// 내부에서 new 를 하지 말고, 객체를 받아오는 setter 를 만들어주도록 한다.
private Keyboard keyboard;
private Mouse mouse;
public void setKeyboard(Keyboard keyboard){
this.keyboard = keyboard;
}
public void setMouse(Mouse mouse){
this.mouse = mouse;
}
public void boot(){
System.out.println("booting...");
keyboard.connect();
mouse.connect();
}
}
///////////////// 주변기기 ///////////////////////
interface device{
public void connect();
}
//키보드
interface Keyboard extends device{
public char pressKey(char c);
}
class SKeyboard implements Keyboard{
public void connect(){
System.out.println("connect SKeyboard");
}
public char pressKey (char c){
return c;
}
}
class LKeyboard implements Keyboard{
public void connect(){
System.out.println("connect LKeyboard");
}
public char pressKey (char c){
return c;
}
}
//마우스
interface Mouse extends device{
public boolean click();
}
class SMouse implements Mouse{
public void connect(){
System.out.println("connect SMouce");
}
public boolean click(){
return true;
}
}
class LMouse implements Mouse{
public void connect(){
System.out.println("connect SMouce");
}
public boolean click(){
return true;
}
}
[예제 2]
package : [com.calc.process]
public interface Action {
public void execute(double a, double b);
}
public class AddAction implements Action{
public void execute(double a, double b){
System.out.println(a+b);
}
}
public class DivAction implements Action {
@Override
public void execute(double a, double b) {
System.out.println(a/b);
}
}
public class MulAction implements Action {
@Override
public void execute(double a, double b) {
System.out.println(a*b);
}
}
public class SubAction implements Action {
@Override
public void execute(double a, double b) {
System.out.println(a-b);
}
}
package : [com.calc.calculator]
public class CalculatorService {
private Action action;
public void setAction(Action action){
this.action = action;
}
public void huh(){
Scanner scan = new Scanner(System.in);
System.out.println("first num : ");
double a = scan.nextDouble();
System.out.println("second num : ");
double b = scan.nextDouble();
action.execute(a, b);
}
}
//////////////////////////////////////////////////
public class CalculatorServiceTest {
public static void main(String[] args) {
CalculatorService ob = new CalculatorService();
Scanner scan = new Scanner(System.in);
System.out.println("choose operator( 1. add, 2. sub, 3. mul, 4. div) :");
int choice = scan.nextInt();
// main 에서 구체적인 액션명을 알아야 하는 문제를 해결하기 위해서는
//front controller 가 필요하다.
if(choice ==1)
ob.setAction(new AddAction());
else if(choice ==2)
ob.setAction(new SubAction());
else if(choice ==3)
ob.setAction(new MulAction());
else if(choice ==4)
ob.setAction(new DivAction());
else{
System.out.println("wrong input.");
return;
}
ob.huh();
}
}