首頁(yè)常見問題正文

請(qǐng)寫出一個(gè)符合開閉原則的設(shè)計(jì)模式的例子_java設(shè)計(jì)模式

更新時(shí)間:2023-09-06 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  開閉原則是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,它要求軟件實(shí)體(如類、模塊、函數(shù)等)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。也就是說,當(dāng)需要添加新功能或修改現(xiàn)有功能時(shí),不應(yīng)該修改已有的代碼,而是通過擴(kuò)展來實(shí)現(xiàn)。一個(gè)符合開閉原則的設(shè)計(jì)模式是"策略模式"(Strategy Pattern)。

  策略模式的主要目的是定義一系列算法,將每個(gè)算法封裝成一個(gè)獨(dú)立的策略類,然后客戶端可以選擇不同的策略對(duì)象來執(zhí)行不同的算法,而不需要改變客戶端的代碼。這種模式使得系統(tǒng)更加靈活,可以輕松添加新的策略,同時(shí)保持了代碼的可維護(hù)性和可擴(kuò)展性。

1693966723380_java中符合開閉原則的設(shè)計(jì)模式.jpg

  下面筆者將詳細(xì)介紹策略模式的實(shí)現(xiàn):

  1. 定義策略接口:

  首先,我們定義一個(gè)策略接口,它包含一個(gè)執(zhí)行算法的方法:

interface PaymentStrategy {
    void pay(int amount);
}

  2. 實(shí)現(xiàn)具體策略類:

  然后,我們創(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");
    }
}

  3.創(chuàng)建上下文類:

  上下文類負(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);
    }
}

  4.客戶端使用策略模式:

  客戶端可以輕松地創(chuàng)建不同的支付策略對(duì)象并將其注入購(gòu)物車對(duì)象,然后調(diào)用購(gòu)物車的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);
    }
}

  通過策略模式,我們可以輕松地?cái)U(kuò)展系統(tǒng),添加新的支付方式,而不需要修改現(xiàn)有的代碼。這符合開閉原則,因?yàn)槲覀兛梢酝ㄟ^添加新的策略類來擴(kuò)展系統(tǒng),而不會(huì)對(duì)購(gòu)物車或客戶端代碼進(jìn)行修改。這種模式使得系統(tǒng)更加靈活、可維護(hù)和可擴(kuò)展。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!