前言
在軟件開發中,為了提高軟件系統的可維護性和可復用性,增加軟件的可擴展性和靈活性,程序員要盡量根據 7 條原則來開發程序,從而提高軟件開發效率、節約軟件開發成本和維護成本。我們將在下面的幾節中依次來介紹這 7 條原則,本節首先介紹開閉原則。
開閉原則定義
開閉原則規定“軟件中的對象(類,模塊,函數等等)應該對於擴展是開放的,但是對於修改是封閉的”,這意味着一個實體是允許在不改變它的源代碼的前提下變更它的行為。該特性在產品化的環境中是特別有價值的,在這種環境中,改變源代碼需要代碼審查,單元測試以及諸如此類的用以確保產品使用質量的過程。遵循這種原則的代碼在擴展時並不發生改變,因此無需上述的過程。
我們通常在程序設計中利用接口、抽象類、繼承和實現等方式來體現開閉原則。
開閉原則作用
開閉原則是面向對象程序設計的終極目標,它使軟件實體擁有一定的適應性和靈活性的同時具備穩定性和延續性。具體來說,其作用如下
- 對軟件測試的影響
軟件遵守開閉原則的話,軟件測試時只需要對擴展的代碼進行測試就可以了,因為原有的測試代碼仍然能夠正常運行。 - 可以提高代碼的可復用性
粒度越小,被復用的可能性就越大;在面向對象的程序設計中,根據原子和抽象編程可以提高代碼的可復用性。 - 可以提高軟件的可擴展性和可維護性
遵守開閉原則的軟件,其穩定性高和延續性強,從而易於擴展和維護。
開閉原則案例
1. 描述
我們設計圖書接口、電子書接口、以及SSM電子書類和美食書籍類。電子書接口通過繼承圖書接口,對其進行了擴展,增加了getSize()
方法,即獲取電子書內存大大小。SSM電子書類通過實現電子書接口進一步擴展,增加了SSMComtent
方法。美食書籍類通過實現圖書接口,同樣實現了擴展的方法。
以后如果我們有了更多的武俠類、游戲類……等書籍,不需要對原來的圖書接口進行修改,只需要繼承完成擴展即可。
2. uml 圖
3. 具體代碼
圖書接口
import java.util.Date;
/**
* 圖書接口
* 價格、書名、出版日期
*/
public interface IBook {
double getPrince();
String getName();
Date publishDate();
}
電子書接口,擴展了一個方法獲取電子書所占大小的方法。
/**
* 電子書接口
*/
public interface IComputerBook extends IBook{
/**
* 獲取電子書大小 16kb
* */
String getSize();
}
實現圖書接口實現擴展。
import java.util.Date;
public class FoodBook implements IBook{
private String name;
private double price;
private Date publishDate;
public FoodBook(String name, double price, Date publishDate) {
this.name = name;
this.price = price;
this.publishDate = publishDate;
}
@Override
public double getPrince() {
return price;
}
@Override
public String getName() {
return name;
}
@Override
public Date publishDate() {
return publishDate;
}
public void foodContent() {
System.out.println("美食書籍: " + name + "-內容豐富哦!僅需要" + price +"元");
}
}
實現電子書接口實現擴展。
import java.util.Date;
public class SSMBook implements IComputerBook {
private String name;
private double price;
private Date publishDate;
private String size;
private String author;
public SSMBook(String name, double price, Date publishDate, String size, String author) {
this.name = name;
this.price = price;
this.publishDate = publishDate;
this.size = size;
this.author = author;
}
@Override
public String getSize() {
return size;
}
@Override
public double getPrince() {
return price;
}
@Override
public String getName() {
return name;
}
@Override
public Date publishDate() {
return publishDate;
}
public void SSMComtent() {
System.out.println("SSM架構實戰書籍:" + name + "-作者:" + author);
}
}
測試類
import java.util.Date;
public class Main {
public static void main(String[] args) {
FoodBook foodBook = new FoodBook("廚房秘籍", 30.00, new Date());
showBookConten(foodBook);
SSMBook ssmBook = new SSMBook("ssm架構", 57.20, new Date(), "20MB", "anben");
showBookConten(ssmBook);
}
private static void showBookConten(IBook iBook) {
if (iBook instanceof IComputerBook) {
SSMBook ssmBook = (SSMBook) iBook;
ssmBook.SSMComtent();
} else {
FoodBook foodBook = (FoodBook) iBook;
foodBook.foodContent();
}
}
}
測試結果
美食書籍: 廚房秘籍-內容豐富哦!僅需要30.0元
SSM架構實戰書籍:ssm架構-作者:anben