개발메모장

Interface

dorosy 2014. 12. 18. 16:59

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();
 }
}