更新時間:2023-09-06 來源:黑馬程序員 瀏覽量:
開閉原則是面向對象設計中的一個重要原則,它要求軟件實體(如類、模塊、函數等)應該對擴展開放,對修改關閉。也就是說,當需要添加新功能或修改現有功能時,不應該修改已有的代碼,而是通過擴展來實現。一個符合開閉原則的設計模式是"策略模式"(Strategy Pattern)。
策略模式的主要目的是定義一系列算法,將每個算法封裝成一個獨立的策略類,然后客戶端可以選擇不同的策略對象來執(zhí)行不同的算法,而不需要改變客戶端的代碼。這種模式使得系統更加靈活,可以輕松添加新的策略,同時保持了代碼的可維護性和可擴展性。
下面筆者將詳細介紹策略模式的實現:
首先,我們定義一個策略接口,它包含一個執(zhí)行算法的方法:
interface PaymentStrategy { void pay(int amount); }
然后,我們創(chuàng)建多個具體的策略類,每個類代表一種支付方式,實現了策略接口:
class CreditCardPayment implements PaymentStrategy { @Override public void pay(int amount) { System.out.println("Paid " + amount + " via Credit Card"); } } class PayPalPayment implements PaymentStrategy { @Override public void pay(int amount) { System.out.println("Paid " + amount + " via PayPal"); } } class CashPayment implements PaymentStrategy { @Override public void pay(int amount) { System.out.println("Paid " + amount + " in cash"); } }
上下文類負責維護一個對策略對象的引用,并在需要時切換不同的策略:
class ShoppingCart { private PaymentStrategy paymentStrategy; public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void checkout(int amount) { paymentStrategy.pay(amount); } }
客戶端可以輕松地創(chuàng)建不同的支付策略對象并將其注入購物車對象,然后調用購物車的checkout方法來完成支付:
public class Client { public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); // 選擇不同的支付策略 cart.setPaymentStrategy(new CreditCardPayment()); cart.checkout(1000); cart.setPaymentStrategy(new PayPalPayment()); cart.checkout(500); cart.setPaymentStrategy(new CashPayment()); cart.checkout(200); } }
通過策略模式,我們可以輕松地擴展系統,添加新的支付方式,而不需要修改現有的代碼。這符合開閉原則,因為我們可以通過添加新的策略類來擴展系統,而不會對購物車或客戶端代碼進行修改。這種模式使得系統更加靈活、可維護和可擴展。