開閉原則(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" )); |
不過這些設計原則到不是絕對的,而是根據項目需求,實際需求來定奪使用