Có rất nhiều câu trả lời tuyệt vời ở đây, nhưng tôi thường thấy sử dụng CẢ HAI giao diện và các lớp trừu tượng là cách tốt nhất. Hãy xem xét ví dụ giả định này:
Bạn là nhà phát triển phần mềm tại một ngân hàng đầu tư và cần xây dựng một hệ thống đặt hàng vào thị trường. Giao diện của bạn nắm bắt được ý tưởng chung hầu hết những gì một hệ thống giao dịch thực hiện ,
1) Trading system places orders
2) Trading system receives acknowledgements
và có thể được chụp trong một giao diện, ITradeSystem
public interface ITradeSystem{
public void placeOrder(IOrder order);
public void ackOrder(IOrder order);
}
Giờ đây, các kỹ sư làm việc tại quầy bán hàng và dọc theo các ngành kinh doanh khác có thể bắt đầu giao tiếp với hệ thống của bạn để thêm chức năng đặt hàng vào các ứng dụng hiện có của họ. Và bạn thậm chí còn chưa bắt đầu xây dựng! Đây là sức mạnh của giao diện.
Vì vậy, bạn tiếp tục và xây dựng hệ thống cho các nhà giao dịch chứng khoán ; họ nghe nói rằng hệ thống của bạn có tính năng tìm cổ phiếu giá rẻ và rất háo hức dùng thử! Bạn nắm bắt được hành vi này trong một phương pháp được gọi là findGoodDeals()
, nhưng cũng nhận ra rằng có rất nhiều thứ lộn xộn liên quan đến việc kết nối với thị trường. Ví dụ, bạn phải mở 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);
}
Việc triển khai cụ thể sẽ có rất nhiều phương pháp lộn xộn như thế này connectToMarket()
, nhưng liệu findGoodDeals()
các nhà giao dịch có thực sự quan tâm hay không.
Bây giờ đây là nơi các lớp trừu tượng phát huy tác dụng. Sếp của bạn thông báo với bạn rằng các nhà giao dịch tiền tệ cũng muốn sử dụng hệ thống của bạn. Và nhìn vào thị trường tiền tệ, bạn thấy hệ thống ống nước gần giống với thị trường chứng khoán. Trong thực tế, connectToMarket()
có thể được sử dụng lại nguyên văn để kết nối với thị trường ngoại hối. Tuy nhiên, findGoodDeals()
là một khái niệm khác nhiều trong lĩnh vực tiền tệ. Vì vậy, trước khi bạn vượt qua khỏi sự codebase đến ngoại hối Wiz đứa trẻ bên kia đại dương, bạn Refactor đầu tiên vào một abstract
lớp, để lại findGoodDeals()
unimplmented
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>
}
Hệ thống giao dịch chứng khoán của bạn triển khai findGoodDeals()
như bạn đã xác định,
public class StockTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
nhưng giờ đây, FX whiz kid có thể xây dựng hệ thống của mình bằng cách đơn giản cung cấp triển khai findGoodDeals()
cho các loại tiền tệ; cô ấy không cần phải thực hiện lại các kết nối socket hoặc thậm chí các phương thức giao diện!
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);
}
Việc lập trình cho một giao diện rất mạnh mẽ, nhưng các ứng dụng tương tự thường thực hiện lại các phương pháp theo những cách gần giống nhau. Việc sử dụng một lớp trừu tượng sẽ tránh được các mô tả lại, đồng thời bảo toàn sức mạnh của giao diện.
Lưu ý: người ta có thể thắc mắc tại sao findGreatDeals()
không phải là một phần của giao diện. Hãy nhớ rằng, giao diện xác định các thành phần chung nhất của hệ thống giao dịch. Một kỹ sư khác có thể phát triển một hệ thống giao dịch HOÀN TOÀN KHÁC BIỆT, nơi họ không quan tâm đến việc tìm kiếm những giao dịch tốt. Giao diện đảm bảo rằng bàn bán hàng cũng có thể giao tiếp với hệ thống của họ, vì vậy bạn không nên để giao diện của mình vướng vào các khái niệm ứng dụng như "ưu đãi lớn".