天天看點

【愚公系列】2021年12月 面向對象設計原則(二)-開放閉合原則(Open-Closed Principle or OCP)

文章目錄

前言

一、開放閉合原則(Open-Closed Principle or OCP)

二、使用步驟

示例

總結

常用的面向對象設計原則有七個,這七大設計原則都是以可維護性和可複用性為基礎的,這些原則并不是孤立存在的,它們互相依賴互相補充,遵循這些設計原則可以有效地提高系統的複用性,同時提高系統的可維護性。

提示:以下是本篇文章正文内容,下面案例可供參考

開放閉合原則又叫開閉原則,即軟體實體應當對擴充開放,對修改封閉。

開閉原則就是指軟體實體應當盡量保證在不修改原有代碼的情況下,對軟體進行擴充。開閉原則是面向對象設計的基石。

public interface IMobilePhone {

    decimal Price { get; set; }
    string Model { get; set; }
    Color Color { get; set; }

}      
public enum Color {
    Black,
    White
}      

首先用IMobilePhone接口建立手機契約,并向外暴露3個屬性,Price屬性為手機價格,Model屬性為手機型号,Color屬性為手機外觀顔色,接下來我們用此接口實作一個ApplePhoneX的類。

注:手機接口IMobilePhone最好不要命名為IPhone,ApplePhoneX類不要命名為IPhoneX,因為這容易引起誤解。

public class ApplePhoneX : IMobilePhone {

    public virtual double Price {
        get => 8799;
        set => Price = value;
    }

    public virtual string Model {
        get => "IPhone X";
        set => Model = value;
    }

    public virtual Color Color {
        get => Color.Black;
        set => Color = value;
    }

}      

以下是一個調用方可能的代碼:

IMobilePhone mobilePhone = new ApplePhoneX();
var price = mobilePhone.Price;      

現在需求發生了變化,因為IPhone9上市在即,庫克決定為IPhoneX打折促銷,黑色的IPhoneX降價為6500.00元,白色的IPhoneX降價為6450.00元, 容易想到的一個做法是,修改IMobilePhone接口,增加DiscountPrice屬性,可能如下所示:

public interface IMobilePhone {

    double Price { get; set; }
    string Model { get; set; }
    Color Color { get; set; }
    double DiscountPrice { get; set; }//增加

}      
public class ApplePhoneX : IMobilePhone {

    public virtual double Price {
        get => 8799;
        set => Price = value;
    }

    public virtual string Model {
        get => "IPhone X";
        set => Model = value;
    }

    public virtual Color Color {
        get => Color.Black;
        set => Color = value;
    }

    public virtual double DiscountPrice {//增加
        get => Color == Color.Black ? 6500.00 : 6450.00;
        set => DiscountPrice = value;
    }

}      
public class HuaweiPhone : IMobilePhone {
    //需要修改
}      
public class SmartisanPhone : IMobilePhone {
    //需要修改
}      

但是這次修改将會影響到所有實作IMobilePhone接口的類,比如HuaweiPhone類和SmartisanPhone類。接口作為一種契約,應當是一種穩定的存在,不允許輕易修改,否則将明顯違反開閉原則。以下給出一個解決方案以供參考:

public class DiscountApplePhoneX : ApplePhoneX {

    public override double Price {
        get => Color == Color.Black ? 6500.00 : 6450.00;
        set => Price = value;
    }

}      
IMobilePhone mobilePhone = new DiscountApplePhoneX();
var price = mobilePhone.Price;      

通過增加一個繼承自ApplePhoneX的DiscountApplePhoneX類并重寫Price方法來解決這個新需求,原來的所有代碼均不需要更改,隻要在使用打折手機的地方修改其使用即可,符合開閉原則。

開閉原則是一個最基本的原則,另外五個原則都是開閉原則的具體形态,是指導設計的工具和方法,而開閉原則才是精神領袖.

開閉原則有利于進行單元測試

開閉原則可以提高複用性

開閉原則可以提高可維護性

面向對象開發的要求

繼續閱讀