設計模式--6大原則--開閉原則

開閉原則(Open Closed Principle)

開閉原則的核心是:對擴展開放,對修改關閉

白話意思就是我們改變一個軟件時(比如擴展其他功能),應該通過擴展的方式來達到軟件的改變,而不應愛修改原有代碼來實現變化

 

開閉原則算是前5中原則的一個抽象總結,前五種是開閉原則的一些具體實現,所以如果使用開閉原則,其實有點虛,因爲它沒有一個固定的模式,但是最終保證的是提高程序的複用性、可維護性等要求

要使用這一原則還需要結合着它的思想“對擴展開放,對修改關閉”與其他的五大設計原則根據經驗來開發項目

大體是這個意思,如果想深究,還需要看看其他的書籍

下面是使用開閉原則的一個簡單示例,雖有些不準確,但是是這個意思(領會精神)

定義一個接口,尋找美女

package com.loulijun.chapter6;
 
public interface IFindGirl {
    //年齡
    public int getAge();
    //姓名
    public String getName();
    //長相
    public String getFace();
    //身材
    public String getFigure();
}

實現這個接口

package com.loulijun.chapter6;
 
public class FindGirl implements IFindGirl {
    private String name;
    private int age;
    private String face;
    private String figure;
     
    public FindGirl(String name, int age, String face, String figure)
    {
        this.name = name;
        this.age = age;
        this.face = face;
        this.figure = figure;
    }
 
    @Override
    public int getAge() {
        return age;
    }
 
    @Override
    public String getFace() {
        return face;
    }
 
    @Override
    public String getFigure() {
        return figure;
    }
 
    @Override
    public String getName() {
        return name;
    }
     
 
}

場景:大街上

package com.loulijun.chapter6;
 
import java.text.NumberFormat;
import java.util.ArrayList;
 
public class Street {
    private final static ArrayList<IFindGirl> girls = new ArrayList<IFindGirl>();
    //靜態初始化塊
    static
    {
        girls.add(new FindGirl("張含韻",23,"可愛型","165cm/47kg"));
        girls.add(new FindGirl("高圓圓",33,"時尚型","165cm/48kg"));
        girls.add(new FindGirl("章澤天",19,"清純型","168cm/47kg"));
    }
    public static void main(String args[])
    {
        System.out.println("----------美女在這裏----------");
        for(IFindGirl girl:girls)
        {
            System.out.println("姓名:"+girl.getName()+" 年齡:"+girl.getAge()+
                    "  長相:"+girl.getFace()+"  身材:"+girl.getFigure());
        }
    }
}

運行結果:

----------美女在這裏----------
姓名:張含韻 年齡:23 長相:可愛型 身材:165cm/47kg
姓名:高圓圓 年齡:33 長相:時尚型 身材:165cm/48kg
姓名:章澤天 年齡:19 長相:清純型 身材:168cm/47kg

但是如果想獨立分出一個外國美女的類別的話(比如增加一個國籍),可以通過修改接口、修改實現類、通過擴展來實現。

如果修改接口,也就意味着修改實現類,這樣對項目的變動太大了,所以不推薦

如果修改實現類,這樣雖能解決問題,但是明顯有些牽強,如果需要其他變動的時候會顯得邏輯混亂

所以,通過擴展來實現是最簡單的方式

如何擴展:

可以定義一個IForeigner接口繼承自IFindGirl,在IForeigner接口中添加國籍屬性getCountry(),然後實現這個接口即可,然後就只需要在場景類中做稍微修改就可以了

package com.loulijun.chapter6;
 
public interface IForeigner extends IFindGirl {
    //國籍
    public String getCountry();
}

實現接口

package com.loulijun.chapter6;
 
public class ForeignerGirl implements IForeigner {
    private String name;
    private int age;
    private String country;
    private String face;
    private String figure;
     
    public ForeignerGirl(String name, int age, String country, String face, String figure)
    {
        this.name = name;
        this.age = age;
        this.country = country;
        this.face =face;
        this.figure = figure;
    }
    @Override
    public String getCountry() {
        // TODO Auto-generated method stub
        return country;
    }
 
    @Override
    public int getAge() {
        // TODO Auto-generated method stub
        return age;
    }
 
    @Override
    public String getFace() {
        // TODO Auto-generated method stub
        return face;
    }
 
    @Override
    public String getFigure() {
        // TODO Auto-generated method stub
        return figure;
    }
 
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }
 
}

然後在場景類中只需要修改如下代碼即可,其他不變

girls.add(new ForeignerGirl("Avirl",28,"美國","性感型","160cm/45kg"));

不過這些設計原則到不是絕對的,而是根據項目需求,實際需求來定奪使用

發佈了11 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章