更新時(shí)間:2023-09-06 來(lái)源:黑馬程序員 瀏覽量:
開(kāi)閉原則是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,它要求軟件實(shí)體(如類、模塊、函數(shù)等)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。也就是說(shuō),當(dāng)需要添加新功能或修改現(xiàn)有功能時(shí),不應(yīng)該修改已有的代碼,而是通過(guò)擴(kuò)展來(lái)實(shí)現(xiàn)。一個(gè)符合開(kāi)閉原則的設(shè)計(jì)模式是"策略模式"(Strategy Pattern)。
策略模式的主要目的是定義一系列算法,將每個(gè)算法封裝成一個(gè)獨(dú)立的策略類,然后客戶端可以選擇不同的策略對(duì)象來(lái)執(zhí)行不同的算法,而不需要改變客戶端的代碼。這種模式使得系統(tǒng)更加靈活,可以輕松添加新的策略,同時(shí)保持了代碼的可維護(hù)性和可擴(kuò)展性。
下面筆者將詳細(xì)介紹策略模式的實(shí)現(xiàn):
首先,我們定義一個(gè)策略接口,它包含一個(gè)執(zhí)行算法的方法:
interface PaymentStrategy { void pay(int amount); }
然后,我們創(chuàng)建多個(gè)具體的策略類,每個(gè)類代表一種支付方式,實(shí)現(xiàn)了策略接口:
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"); } }
上下文類負(fù)責(zé)維護(hù)一個(gè)對(duì)策略對(duì)象的引用,并在需要時(shí)切換不同的策略:
class ShoppingCart { private PaymentStrategy paymentStrategy; public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void checkout(int amount) { paymentStrategy.pay(amount); } }
客戶端可以輕松地創(chuàng)建不同的支付策略對(duì)象并將其注入購(gòu)物車對(duì)象,然后調(diào)用購(gòu)物車的checkout方法來(lái)完成支付:
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); } }
通過(guò)策略模式,我們可以輕松地?cái)U(kuò)展系統(tǒng),添加新的支付方式,而不需要修改現(xiàn)有的代碼。這符合開(kāi)閉原則,因?yàn)槲覀兛梢酝ㄟ^(guò)添加新的策略類來(lái)擴(kuò)展系統(tǒng),而不會(huì)對(duì)購(gòu)物車或客戶端代碼進(jìn)行修改。這種模式使得系統(tǒng)更加靈活、可維護(hù)和可擴(kuò)展。
什么情況下會(huì)違反迪米特法則?為什么會(huì)有這個(gè)問(wèn)題?
2023-09-06Java中,Serializable與Externalizable的區(qū)別?
2023-09-05列舉spring支持的事務(wù)管理類型_java技能培訓(xùn)
2023-09-04MyBatisPlus可用的插件有哪些?如何添加和使用插件?
2023-09-01SpringBoot實(shí)現(xiàn)微信掃碼支付starter封裝?
2023-09-01黑馬最新MybatisPlus教程,4小時(shí)快速掌握高效開(kāi)發(fā)秘訣
2023-09-01