設計模式6大原則:開閉原則
開閉原則(Open Closed Principle)
開閉原則的核心是:對擴展開放,對修改關閉。
白話意思就是我們改變一個軟件時(比如擴展其他功能),應該通過擴展的方式來達到軟件的改變,而不應愛修改原有代碼來實現(xiàn)變化。
開閉原則算是前5中原則的一個抽象總結,前五種是開閉原則的一些具體實現(xiàn),所以如果使用開閉原則,其實有點虛,因為它沒有一個固定的模式,但是最終保證的是提高程序的復用性、可維護性等要求。
要使用這一原則還需要結合著它的思想“對擴展開放,對修改關閉”與其他的五大設計原則根據(jù)經(jīng)驗來開發(fā)項目。
大體是這個意思,如果想深究,還需要看看其他的書籍。
下面是使用開閉原則的一個簡單示例,雖有些不準確,但是是這個意思(領會精神)。
定義一個接口,尋找美女
- package com.loulijun.chapter6;
 - public interface IFindGirl {
 - //年齡
 - public int getAge();
 - //姓名
 - public String getName();
 - //長相
 - public String getFace();
 - //身材
 - public String getFigure();
 - }
 
實現(xiàn)這個接口
- 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>();
 - //靜態(tài)初始化塊
 - 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
但是如果想獨立分出一個外國美女的類別的話(比如增加一個國籍),可以通過修改接口、修改實現(xiàn)類、通過擴展來實現(xiàn)。
如果修改接口,也就意味著修改實現(xiàn)類,這樣對項目的變動太大了,所以不推薦
如果修改實現(xiàn)類,這樣雖能解決問題,但是明顯有些牽強,如果需要其他變動的時候會顯得邏輯混亂
所以,通過擴展來實現(xiàn)是最簡單的方式
如何擴展:
可以定義一個IForeigner接口繼承自IFindGirl,在IForeigner接口中添加國籍屬性getCountry(),然后實現(xiàn)這個接口即可,然后就只需要在場景類中做稍微修改就可以了
- package com.loulijun.chapter6;
 - public interface IForeigner extends IFindGirl {
 - //國籍
 - public String getCountry();
 - }
 
實現(xiàn)接口
- 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"));
 
不過這些設計原則到不是絕對的,而是根據(jù)項目需求,實際需求來定奪使用。
原文鏈接:http://www.cnblogs.com/loulijun/archive/2012/03/14/2394055.html
【編輯推薦】















 
 
 



 
 
 
 