여기에는 훌륭한 답변이 많이 있지만 인터페이스와 추상 클래스를 모두 사용하는 것이 가장 좋은 방법이라는 것을 종종 발견합니다. 이 인위적인 예를 고려하십시오.
당신은 투자 은행의 소프트웨어 개발자이고 시장에 주문하는 시스템을 구축해야합니다. 귀하의 인터페이스는 거래 시스템 이 하는 일에 대한 가장 일반적인 아이디어를 포착합니다 .
1) Trading system places orders
2) Trading system receives acknowledgements
인터페이스에서 캡처 할 수 있습니다. ITradeSystem
public interface ITradeSystem{
public void placeOrder(IOrder order);
public void ackOrder(IOrder order);
}
이제 영업 데스크 및 기타 비즈니스 라인에서 일하는 엔지니어는 시스템과 인터페이스 하여 기존 앱에 주문 배치 기능을 추가 할 수 있습니다 . 그리고 당신은 아직 건축을 시작하지 않았습니다! 이것이 인터페이스의 힘입니다.
그래서 계속해서 주식 거래자를 위한 시스템을 구축하십시오 . 그들은 당신의 시스템에 값싼 주식을 찾는 기능이 있다고 들었고 그것을 시험해보고 싶어합니다! 이 동작을라는 메서드로 캡처 findGoodDeals()
하지만 시장에 연결하는 데 관련된 복잡한 요소가 많이 있다는 것도 알고 있습니다. 예를 들어, 당신은SocketChannel
,
public class StockTradeSystem implements ITradeSystem{
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
구체적인 구현에는와 같은 지저분한 메소드가 많이 connectToMarket()
있지만findGoodDeals()
모든 상인이 실제로 걱정입니다.
이제 여기에서 추상 클래스가 작동합니다. 상사는 통화 거래자들도 귀하의 시스템을 사용하기를 원한다고 알려줍니다. 통화 시장을 보면 배관이 주식 시장과 거의 동일하다는 것을 알 수 있습니다. 실제로 connectToMarket()
외환 시장에 연결하기 위해 그대로 재사용 할 수 있습니다. 그러나 findGoodDeals()
통화 분야에서는 훨씬 다른 개념입니다. 따라서 코드베이스를 바다 건너 외환 마법사 에게 전달하기 전에 먼저 abstract
클래스 로 리팩토링하여 구현되지 않은 상태로 findGoodDeals()
둡니다.
public abstract class ABCTradeSystem implements ITradeSystem{
public abstract void findGoodDeals();
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
주식 거래 시스템 findGoodDeals()
은 이미 정의한대로 구현 됩니다.
public class StockTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
하지만 이제 FX 전문가는 단순히 findGoodDeals()
통화 구현을 제공함으로써 시스템을 구축 할 수 있습니다 . 그녀는 소켓 연결이나 인터페이스 메서드를 다시 구현할 필요가 없습니다!
public class CurrencyTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
ccys = <Genius stuff to find undervalued currencies>
System.out.println("The best FX spot rates are: " + ccys);
}
인터페이스 프로그래밍은 강력하지만 유사한 응용 프로그램은 거의 동일한 방식으로 메서드를 다시 구현하는 경우가 많습니다. 추상 클래스를 사용하면 인터페이스의 성능을 유지하면서 단순화를 피할 수 있습니다.
참고 :findGreatDeals()
인터페이스의 일부가 아닌 이유 가 궁금 할 수 있습니다. 인터페이스는 거래 시스템의 가장 일반적인 구성 요소를 정의합니다. 다른 엔지니어는 좋은 거래를 찾는 데 신경 쓰지 않는 완전히 다른 거래 시스템을 개발할 수 있습니다. 이 인터페이스는 영업 데스크가 시스템과도 인터페이스 할 수 있도록 보장하므로 "대가"와 같은 애플리케이션 개념과 인터페이스를 얽 히지 않는 것이 좋습니다.