1. 程式人生 > 其它 >【設計模式】2.設計模式原則-開閉原則

【設計模式】2.設計模式原則-開閉原則

一、原則:

  軟體實體應當對擴充套件開放,對修改關閉。當應用的需求改變時,在不修改軟體實體的原始碼或者二進位制程式碼的前提下,可以擴充套件模組的功能,使其滿足新的需求。

二、軟體實體包含哪些?

  1.專案中劃分出的模組

  2.類與介面

  3.方法

三、 作用:

  1.對軟體測試的影響。軟體遵守開閉原則的話,軟體測試時只需要對擴充套件的程式碼進行測試就可以了,因為原有的測試程式碼仍然能夠正常執行。

  2.提高程式碼的可複用性。粒度越小,被複用的可能性就越大;在面向物件的程式設計中,根據原子和抽象變成可以提高程式碼的可複用性。

  3.可以提高軟體的可維護性。遵守開閉原則的軟體,其穩定性高和延續性強,從而易於擴充套件和維護。

四、實現方法:

  1.可以通過“抽象約束,封裝變化”來實現開閉原則,即通過介面或者抽象類為軟體實體定義一個相對穩定的抽象層,而將相同的可變因素封裝在相同的具體實現類中。

  2.因為抽象靈活性好,適應性廣,只要抽象的合理,可以基本保持軟體架構的穩定。而軟體中易變的細節可以從抽象派生來的實現類來進行擴充套件,當軟體需要發生變化時,只需要根據需求重新派生一個實現類來擴充套件就可以了。

五、哪些設計模式用到了這個原則?

  抽象工廠模式,簡單工廠模式,工廠模式。

六、示例:

  比如資料庫中儲存的使用者的身份證和姓名都是加密的,平時使用時需要用到未加密的身份證和姓名資訊,因此在使用者的實體類中加兩個get方法,用於獲取未加密的身份證和姓名資訊,get方法裡面新增解密功能。但是不會重寫原來獲取加密身份證和姓名的方法:

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Table(name = "`user`")
@Data
public class User implements Serializable {
    @Id
    @Column(name = "`sid`")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long sid;

  ...

    
/** * 加密聯絡人 */ @Column(name = "`encryption_contact_name`") private String encryptionContactName; /** * 加密聯絡電話 */ @Column(name = "`encryption_contact_mobile`") private String encryptionContactMobile; ...private static final long serialVersionUID = 1L;
  //這裡是新增的獲取明文資訊的方法
public String getContactName() { if (StringUtil.isNotBlank(this.encryptionContactName)) { return EncryptUtil.decryptName(this.encryptionContactName); } return null; } public void setContactName(String contactName) { this.encryptionContactName = EncryptUtil.encryptName(contactName); } public String getContactMobile() { if (StringUtil.isNotBlank(this.encryptionContactMobile)) { return EncryptUtil.decryptPhone(this.encryptionContactMobile); } return null; } public void setContactMobile(String contactMobile) { this.encryptionContactMobile = EncryptUtil.encryptPhone(contactMobile); } }