開閉原則——面向對象程序設計原則


前言

在軟件開發中,爲了提升軟件系統的可維護性和可複用性,增長軟件的可擴展性和靈活性,程序員要儘可能根據 7 條原則來開發程序,從而提升軟件開發效率、節約軟件開發成本和維護成本。咱們將在下面的幾節中依次來介紹這 7 條原則,本節首先介紹開閉原則。程序員

開閉原則定義

開閉原則規定「軟件中的對象(類,模塊,函數等等)應該對於擴展是開放的,可是對於修改是封閉的」,這意味着一個實體是容許在不改變它的源代碼的前提下變動它的行爲。該特性在產品化的環境中是特別有價值的,在這種環境中,改變源代碼須要代碼審查,單元測試以及諸如此類的用以確保產品使用質量的過程。遵循這種原則的代碼在擴展時並不發生改變,所以無需上述的過程。編程

咱們一般在程序設計中利用接口、抽象類、繼承和實現等方式來體現開閉原則。架構

開閉原則做用

開閉原則是面向對象程序設計的終極目標,它使軟件實體擁有必定的適應性和靈活性的同時具有穩定性和延續性。具體來講,其做用以下ide

  1. 對軟件測試的影響
    軟件遵照開閉原則的話,軟件測試時只須要對擴展的代碼進行測試就能夠了,由於原有的測試代碼仍然可以正常運行。
  2. 能夠提升代碼的可複用性
    粒度越小,被複用的可能性就越大;在面向對象的程序設計中,根據原子和抽象編程能夠提升代碼的可複用性。
  3. 能夠提升軟件的可擴展性和可維護性
    遵照開閉原則的軟件,其穩定性高和延續性強,從而易於擴展和維護。

開閉原則案例

1. 描述

咱們設計圖書接口、電子書接口、以及SSM電子書類和美食書籍類。電子書接口經過繼承圖書接口,對其進行了擴展,增長了getSize()方法,即獲取電子書內存大大小。SSM電子書類經過實現電子書接口進一步擴展,增長了SSMComtent方法。美食書籍類經過實現圖書接口,一樣實現了擴展的方法。函數

之後若是咱們有了更多的武俠類、遊戲類……等書籍,不須要對原來的圖書接口進行修改,只須要繼承完成擴展便可。單元測試

2. uml 圖


3. 具體代碼

圖書接口測試

import java.util.Date;

/**
 * 圖書接口
 * 價格、書名、出版日期
 */
public interface IBook {
    double getPrince();
    String getName();
    Date publishDate();
}

電子書接口,擴展了一個方法獲取電子書所佔大小的方法。this

/**
 * 電子書接口
 */
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
相關文章
相關標籤/搜索