天天看點

想要寫出優秀的Java代碼?學會抽象類和政策設計模式是關鍵

作者:你的老師父

在Java開發中,我們經常會遇到需要“抽象”的情況。比如,我們可能有多個類需要實作相同的方法,但具體實作方式又不同;或者我們需要定義一些規範,但具體細節由子類實作。這時候,我們就可以使用Java中的抽象類和抽象方法來解決問題。

另外,在軟體開發中,我們也經常會遇到需要根據不同的情況采取不同的政策的情況。此時,我們可以運用政策設計模式來處理。本文将結合代碼示例,詳細介紹Java中的抽象類、抽象方法和政策設計模式,并帶着大家一起實作一個簡單的政策模式示例。

Java抽象類和抽象方法

一、什麼是抽象類?

在Java中,抽象類是一種特殊的類,它不能被執行個體化,隻能作為其他類的父類來使用。抽象類通常用來定義一些基礎的方法和屬性,供子類繼承和實作。

二、如何定義抽象類?

在Java中,可以使用abstract關鍵字來定義一個抽象類。抽象類中可以包含非抽象方法和屬性,也可以包含抽象方法。抽象方法是沒有具體實作的方法,其在抽象類中隻有聲明,而不需要具體的實作。

下面是一個抽象類的示例:

public abstract class Shape {
    protected int x, y;
    
    public void move(int newX, int newY) {
        x = newX;
        y = newY;
    }
    
    public abstract double area();
}
           

上述代碼中,Shape是一個抽象類,它包含兩個非抽象屬性x和y,以及兩個方法move()和area()。其中,move()方法是具體實作的,而area()方法則是抽象的,需要子類來實作。

三、如何實作抽象方法?

當一個類繼承了一個抽象類時,它必須實作該抽象類中所有的抽象方法,否則該類仍然是一個抽象類。如果不想實作某個抽象方法,也可以将該類定義為抽象類。

下面是一個繼承了抽象類的示例:

public class Circle extends Shape {
    private int radius;
    
    public Circle(int x, int y, int r) {
        this.x = x;
        this.y = y;
        radius = r;
    }
    
    public double area() {
        return Math.PI * radius * radius;
    }
}
           

上述代碼中,Circle類繼承了Shape抽象類,并實作了area()方法。注意到,在Circle類中需要使用protected關鍵字來通路Shape類中的屬性x和y。

四、抽象類和接口的差別

雖然抽象類和接口都能夠定義抽象方法,但它們之間還是有一些差異的。下面是它們主要的差別:

  1. 抽象類可以包含非抽象方法和屬性,而接口隻能包含抽象方法和常量。
  2. 一個類隻能繼承一個抽象類,但可以實作多個接口。
  3. 抽象類中的抽象方法可以有具體的實作,但接口中的所有方法都沒有實作。
  4. 接口中的方法預設是公開的,而抽象類中的方法可以有不同的通路權限。

綜上所述,抽象類和接口都是用來實作多态性的工具,但它們的使用場景略有不同。當需要定義一些基礎的屬性和方法,并希望子類繼承時,可以使用抽象類;當需要定義規範或者行為,以供類實作時,可以使用接口。

政策設計模式

一、什麼是政策設計模式?

政策設計模式是一種軟體設計模式,它可以在運作時根據不同的情況選擇不同的算法或政策,來達到相同的目标。政策模式通常包含一個政策接口和多個實作該接口的類,以及一個包含政策對象的環境類。

二、如何實作政策設計模式?

下面我們将通過一個簡單的示例,來介紹如何使用政策設計模式。

假設我們正在編寫一個商場結算系統,它需要根據不同的産品類型和數量,計算出不同的總價。為了實作這個功能,我們可以定義一個PricingStrategy接口,以及多個實作該接口的類,比如:

public interface PricingStrategy {
    double calculatePrice(double price, int quantity);
}

public class NormalStrategy implements PricingStrategy {
    public double calculatePrice(double price, int quantity) {
        return price * quantity;
    }
}

public class DiscountStrategy implements PricingStrategy {
    public double calculatePrice(double price, int quantity) {
        return price * quantity * 0.8;
    }
}

public class RebateStrategy implements PricingStrategy {
    public double calculatePrice(double price, int quantity) {
        return price * quantity - 10;
    }
}
           

上述代碼中,PricingStrategy是政策接口,它定義了一個calculatePrice()方法。NormalStrategy、DiscountStrategy和RebateStrategy分别是實作了PricingStrategy接口的類,它們分别采用不同的算法來計算總價。

接下來,我們可以定義一個包含政策對象的環境類ShoppingCart,用來根據不同的情況選擇不同的算法:

public class ShoppingCart {
    private PricingStrategy strategy;
    
    public void setStrategy(PricingStrategy strategy) {
        this.strategy = strategy;
    }
    
    public double checkout(double price, int quantity) {
        return strategy.calculatePrice(price, quantity);
    }
}
           

在ShoppingCart類中,我們可以通過setStrategy()方法來設定政策對象,并在checkout()方法中調用該對象的calculatePrice()方法,以獲得最終的總價。

三、如何使用政策設計模式?

現在,我們已經實作了一個簡單的政策模式示例。下面是一個使用該示例的代碼:

public static void main(String[] args) {
    ShoppingCart cart = new ShoppingCart();
    PricingStrategy strategy = new DiscountStrategy(); // 選擇打折政策
    cart.setStrategy(strategy);
    
    double price = 100;
    int quantity = 5;
    double totalPrice = cart.checkout(price, quantity);
    
    System.out.println("Total price: " + totalPrice);
}
           

上述代碼中,我們首先建立了一個ShoppingCart對象,并設定了一個打折政策。然後,我們傳入了商品的單價和數量,調用了checkout()方法,獲得了最終的總價。

總結

本文介紹了Java中的抽象類、抽象方法和政策設計模式,并通過代碼示例詳細講解了如何定義抽象類和實作抽象方法,以及如何使用政策設計模式來根據不同的情況選擇不同的算法或政策。

在編寫Java程式時,抽象類和抽象方法可以幫助我們定義基礎的屬性和方法,并實作多态性;而政策設計模式則可以讓我們根據不同的情況選擇不同的算法,進而達到相同的目标。這些工具在Java程式開發中都扮演着重要的角色,掌握它們的使用方法對于提高代碼的可讀性、可維護性和可擴充性都有很大的幫助。

雖然本文涉及的知識點比較基礎,但是掌握好了這些知識點,可以為您的Java程式設計之路打下堅實的基礎。同時,在學習過程中也不要忘記将知識點與實際項目相結合,通過實踐來加深了解和掌握。最後,希望本文能夠為你的學習和工作帶來一些啟發和幫助!

最後再留幾個問題

  1. 抽象類和接口各有什麼優缺點?你更傾向于使用哪一個?
  2. 你認為在實際開發中,什麼情況下适合使用政策設計模式?
  3. 政策設計模式與工廠設計模式有什麼不同?它們可以一起使用嗎?
  4. Java中除了抽象類和接口之外,還有哪些機制可以實作多态性?
  5. 抽象類和普通類相比,有哪些需要注意的地方?

這些問題可以幫助讀者深入探讨本文介紹的知識點,并在實際應用中取得更好的效果。

繼續閱讀