文章目錄
前言
一、開放閉合原則(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方法來解決這個新需求,原來的所有代碼均不需要更改,隻要在使用打折手機的地方修改其使用即可,符合開閉原則。
開閉原則是一個最基本的原則,另外五個原則都是開閉原則的具體形态,是指導設計的工具和方法,而開閉原則才是精神領袖.
開閉原則有利于進行單元測試
開閉原則可以提高複用性
開閉原則可以提高可維護性
面向對象開發的要求