1. 程式人生 > >七大原則之一:開閉原則(OCP)

七大原則之一:開閉原則(OCP)

背景

在產品的開發過程中,需求變更不足為奇。面對更變的需求基於開閉原則的思想是對程式的改動是通過增加程式碼新程式碼 來實現新的需求,而不是更改已經實現就需求的程式碼。因為舊的程式碼可能再別的需求有呼叫,越是底層的類的修改影響別的類就會越多。

定義

開閉原則(The Open-Closeed Principle 簡稱OCP)一個軟體實體例如類、模組和函式應該對擴充套件操作開放,而對修改操作是關閉的。用抽象構建框架,是實現擴充套件細節。

優點

遵循OCP可以提高我們軟體系統的可維護性、可擴充套件性、可複用性、靈活性;對程式中可能頻繁變更的部分做出抽象。

案例

場景一

一個圖書銷售系統中需要書本的銷售資訊。例如書本的作者、書名、售價(簡單點舉三個屬性);基礎面向介面程式設計的思想將這個獲取書名、作、價格折三個功能定義在介面中。實現該介面的方法的不同書本類實現實現具體的業務邏輯即可。

1.介面的定義

package com.mark.design.principle.openclose2;

/**
 * @Description: 定義一個銷售書本的介面:定義獲取書本作者,書名,價格的介面方法
 * @Author: Kingsley
 * @CreateDate: 2018/11/25 18:33
 * @Version: 2.0
 * @Copyright : 豆漿油條個人非正式工作室
 */
public interface IBook {

    /**
     * @return :書本的作者名稱
     */
    String queryAuthor();

    /**
     * @return :書本名稱
     */
String queryBookName(); /** * @return :書本的售價 */ double queryPrice(); }

介面其中一個實現類,實際中該介面會很更多的實現類。

package com.mark.design.principle.openclose2;

/**
 * @Description: 書本介面的一個實現類:《悲傷逆流成河》書本
 * @Author: Kingsley
 * @CreateDate: 2018/11/25 18:38
 * @Version: 2.0
 * @Copyright : 豆漿油條個人非正式工作室
 */
public class CryMeASadRiverBookImpl implements IBook{ private String author; private String bookName; private double price; public CryMeASadRiverBookImpl(String author, String bookName, double price) { this.author = author; this.bookName = bookName; this.price = price; } /** * @return :書本的作者名稱 */ public String queryAuthor() { return this.author; } /** * @return :書本名稱 */ public String queryBookName() { return this.bookName; } /** * @return :書本的售價 */ public double queryPrice() { return this.price; } }

模擬客戶端的測試方法

    /**
     * 需求1:錄入書本《悲傷逆流成河的資訊》,並列印資訊
     */
    @Test
    public void test1(){
        IBook iBook = new CryMeASadRiverBookImpl("小四","《悲傷逆流成河》",10);
        System.out.println("書名:"+iBook.queryBookName());
        System.out.println("作者:"+iBook.queryAuthor());
        System.out.println("售價:"+iBook.queryPrice());
    }

執行結果

書名:《悲傷逆流成河》
作者:小四
售價:10.0

場景二

新需求:4月23日讀書日到了;書本《悲傷逆流成河》書本售價打5折。輸出該書本書本的打折後的資訊。

分析:
思路一:若在介面iBook 介面中新增獲取打折後的價格的方法,在實現類中實現方法。這樣雖然可以達到目的,但是。如果當介面有多個實現類的時候,那麼需要在每個實現類中都實現介面方法。

思路二:直接修改CryMeASadRiverBookImpl中的獲取價格方法。這樣也是可以滴,但是。。。如果原本的實現方法如果邏輯複雜,或者存在被其他的業務呼叫的可能,這樣直接修改現有的程式碼是不可取的。

思路三:基於OPC思想,通過繼承類CryMeASadRiverBookImpl達到既可以不修改原本的類也擴充套件了新的功能的目的。程式碼如下:

package com.mark.design.principle.openclose2;

/**
 * @Description:  《悲傷逆流成河》讀書日折後價的計算實現
 * @Author: Kingsley
 * @CreateDate: 2018/11/25 18:54
 * @Version: 2.0
 * @Copyright : 豆漿油條個人非正式工作室
 * 擴充套件業務:計算打折後的價格
 * 不修改原來的介面和類
 * 通過繼承實現
 */
public class CryMeASadRiverBookDisCountImpl extends   CryMeASadRiverBookImpl{

    public CryMeASadRiverBookDisCountImpl(String author, String bookName, double price) {
        super(author, bookName, price);
    }

    /**
     * 計算五折後的書本價格
     * @return :折後價
     */
    public double queryDicountPrice() {
       return queryPrice()* 0.5;
    }
}

模擬客戶端的測試方法

    /**
     * 新需求:4月23日讀書日到了書本《悲傷逆流成河》書本售價打5折
     */
    @Test
    public void test2(){
        IBook iBook = new CryMeASadRiverBookDisCountImpl("小四","《悲傷逆流成河》",10);
        System.out.println("書名:"+iBook.queryBookName());
        System.out.println("作者:"+iBook.queryAuthor());
        System.out.println("售價:"+iBook.queryPrice());
        CryMeASadRiverBookDisCountImpl disCount = (CryMeASadRiverBookDisCountImpl) iBook;
        System.out.println("折後價:"+disCount.queryDicountPrice());
    }

執行結果

書名:《悲傷逆流成河》
作者:小四
售價:10.0
折後價:5.0

UML圖

在這裡插入圖片描述

相關推薦

七大原則之一原則OCP

背景 在產品的開發過程中,需求變更不足為奇。面對更變的需求基於開閉原則的思想是對程式的改動是通過增加程式碼新程式碼 來實現新的需求,而不是更改已經實現就需求的程式碼。因為舊的程式碼可能再別的需求有呼叫,越是底層的類的修改影響別的類就會越多。 定義 開閉原則(Th

面向對象設計原則原則OCP

name 返回 展開 打開 設計原則 data turn acl int 開閉原則(OCP)定義:對擴展開發,對修改關閉。好處: 適應性和靈活性。 穩定性和延續性。 可復用性與可維護性。 解釋說明:開閉原則指的是兩方面:對功能擴展開發,對修改進

[轉]設計模式六大原則[6]原則

說了 一點 模塊 活性 問題 單一職責原則 就是 認識 適應 定義:一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。 問題由來:在軟件的生命周期內,因為變化、升級和維護等原因需要對軟件原有代碼進行修改時,可能會給舊代碼中引入錯誤,也可能會使我們不得不對整個功能進行

C#軟體設計——小話設計模式原則原則OCP

前言:這篇繼續來看看開閉原則。廢話少說,直接入正題。 軟體設計原則系列文章索引 一、原理介紹 1、官方定義 開閉原則,英文縮寫OCP,全稱Open Closed Principle。 原始定義:Software entities (classes, modules, functions) sho

設計模式六大原則6原則

思考 外部 編程人員 恰恰 單一職責 何事 適應 擴展 分享 開閉原則 定義:一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。 問題由來:在軟件的生命周期內,因為變化、升級和維護等原因需要對軟件原有代碼進行修改時,可能會給舊代碼中引入錯誤,也可能會使我們不得不對

設計模式六大設計原則原則

開發十年,就只剩下這套架構體系了! >>>   

【學習筆記】慕課網—Java設計模式精講 第3章 軟體設計七大原則-3-2 原則

/** * 軟體設計七大原則-開閉原則 * @author cnRicky * @date 2018.11.7 */ 開閉原則 定義:一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉 強調的是用抽象構建框架,用實現擴充套件細節 優點:提高軟體系統的可複用性及可維護性 開閉原則

軟體設計原則之《原則

    開閉原則是所有設計原則的基礎,它非常重要。用一句話來形容開閉原則就是:軟體系統的實現應該對擴充套件開放,對修改關閉。開閉原則的中心思想就是“我們用抽象構建框架,用實現擴充套件細節“。   為了更好的解釋這個抽象的概念,我們一起來看一個例子,其實是很簡單的一個

CSS模組化(五) CSS的設計模式原則之一聚合/組合原則

5. CSS的聚合/組合原則--掛多個class還是新建 CSS裡也包含了設計模式的6大原則,今天講講聚合/組合原則--多用組合,少用繼承 假設有如圖3-1所示的模組。 圖3-1 三個簡單模組 我們如何設定它的CSS呢?方案一如程式碼清單3-11所示。 方案一可以

六大原則之一單一職責原則

ret 延遲函數 data resolve image wfq 成功 appdata scn 解決回調地獄的方法: 1.保持代碼的簡潔性 2.模塊化 綜合上述,可使用六大原則之一單一職責原則 例: //延遲函數 六大原則 // var df =

多執行緒之建立執行緒的方式之一實現Callable介面

對於多執行緒,大家並不陌生,對於如何建立執行緒也是輕車熟路,對於使用new thread和實現runable介面的方式,不再多說。這篇博文我們介紹第三種:實現Callable介面。 Callable介面 介面定義: @FunctionalInterface

第2章 面向物件的設計原則SOLID6_原則

6. 開閉原則(Open Closed Principle,OCP) 6.1 定義 (1)一個類應該對擴充套件開放,對修改關閉。要求通過擴充套件來實現變化,而且是在不修改己有的程式碼情況下進行擴充套件,也不必改動己有的原始碼或二進位制程式碼。 (2)在軟體生命週期內,變化是一個既定的事實

面向對象原則之一 開放封閉原則原則

text uml類圖 一個 cnblogs 面向對象 技術 只有一個 cor pan 原文:面向對象原則之一 開放封閉原則(開閉原則)前言 面向對象有人分為五大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、裏氏替換原則。 也有人分為六大原則,分別為

【設計模式】六大原則之一單一職責與原則

【前言】         最近在學習設計模式,設計模式是面向物件程式設計的。設計模式有6大原則,而實際上都是互補的,也就是說一些原則需要利用另一些原則來實現自己。下面來簡單的介紹一下六大原則其中之二 【單一職責原則】 1、單一職責原則的由來         初學者在程式設計

-原則 Open-Closed principle, OCP

sof 般的 方法 mod 關閉 man nbsp 接口 這一 “開-閉”原則 (Open-Closed principle, OCP) 一個軟件實體應當對擴展開放,對修改關閉。 Software entities should be open for extensio

設計模式之軟體開發原則1原則和依賴倒置原則

開閉原則 定義 所謂開閉原則就是一個軟體實體如類、模組和函式應該對擴充套件開放、對修改關閉。 強呼叫抽象構建框架,實現實現拓展細節。 有優點是提高軟體的複用性和易維護展性。是面向物件的最基本原則。 依賴倒置原則 定義 高層模組不應該依賴底層模組,二者都應該依賴其抽象。 抽象不應該依賴細節:細節應該

7.Java_模板設計模式---抽象類的實際應用咖啡和茶的沖泡法,基於抽象類,核心是封裝演算法。引入鉤子方法。原則。23種設計模式

基於抽象類的模板設計模式,核心是封裝演算法。 1、模板方法定義了一個演算法的步驟,允許子類為一個或多個步驟提供具體實現。 2、模板(模板方法)模式:(典型:Servlet),AQS 在一個方法中定義演算法的框架,將一些具體步驟延遲到子類中實現。 模板模式

支援Open Class特性的程式語言中的原則Open-Closed Principle

我們知道Ruby的語法特性支援Open Class,可以讓使用者重新定義系統中已經存在的類,給其新增方法或屬性。例如: # foo.rb class Foo def method1 *args ... end end 你定義了上面的類Foo之後,可以重新Open它

android 二級快取單一原則原則

import android.content.Context; import android.graphics.Bitmap; import java.io.IOException; /** * SD卡快取 */ public class DiskCache imple

原則C++

概念 對於擴充套件是開放的,對於更改是封閉的。面對新的需求,對程式的改動是通過新加程式碼而進行的,不是更改現有的程式碼。 簡述 開閉原則是面向物件設計的核心所在。遵循這個原則可以帶來面向物件技術所聲稱