1. 程式人生 > >設計模式六大原則之開閉原則

設計模式六大原則之開閉原則

1.定義:

開閉原則是設計模式裡面最基礎的設計原則,它指導我們如何建立一個穩定,靈活的系統。開閉原則定義如下:

一個軟體實體。如類/模組/函都應該對擴充套件開放,對修改關閉。

2.為什麼要有開閉原則或者說開閉原則的好處具體體現在哪裡?

在軟體的生命週期內,因為升級和維護或者要增加需求需要對原有的程式碼進行修改,這時可能會給舊程式碼引入錯誤,並且修改完以後要對原有的程式碼進行重新的測試。也就是說你修改了程式碼以後,既要實現你現在增加的功能,又要實現你以前的功能。

那麼開閉原則的就是解決這個問題的辦法:當軟體需求變化時,儘量通過擴充套件軟體的行為來實現變化,而不是通過修改現有的程式碼來實現變化。

3.舉例子說明:

我們都知道香港澳門迴歸有一個偉大的領導人起了重要的作用,那就是我們敬愛的鄧小平同志,當時鄧小平和英國首相撒切爾夫人談香港問題的時候,如果要求香港回來之後必須要實現社會主義制度,那麼香港迴歸就困難了,香港的老百姓已經習慣了他們現有的殖民統治制度,突然在整個管理制度上改變,香港的老百姓也不答應。為了香港能順利的回到祖國的懷抱,鄧小平實行一國兩制,一個國家兩種制度,在一箇中國的前提下,國家的主體堅持社會主義制度,香港、澳門保持原有的資本主義制度長期不變。鄧小平的這一創舉即實現的祖國的統一,大陸的制度又沒有改變。這豈不是一個更好的辦法。

4.程式碼例子說明

如果讓我們寫一個加法程式我們很快就能完成,程式碼如下: 

static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("請輸入數字A:");
                string strNumberA = Console.ReadLine();
                Console.WriteLine("請輸入運算子(+):");
                string strOperate = Console.ReadLine();
                Console.WriteLine("請輸入數字B:");
                string strNumberB = Console.ReadLine();
                string strResult = "";
                
               strResult = Convert.ToString(Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB));
                        break;
                   
                Console.WriteLine("結果是:"+strResult);
                Console.ReadLine();

            }
            catch (Exception ex)
            {
                Console.WriteLine("您輸入的有錯"+ex.Message);
                Console.ReadKey();

            }

當我們的需求增加時,需要增加減法,乘法和除法的時候,如果我們在在這個類中寫程式碼,那就修改了原有的程式碼這就違背了開閉原則:我們知道開閉原則只能擴充套件,不能修改。那麼我們可以擴充套件一個運算類啊然後讓加減乘除子類繼承這個運算類。然後客戶端類呼叫這個運算類就可以了。程式碼如下:

 運算類:Operation

{class  OperationAdd:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
    class OperationSub:Operation
    {
        public override double GetResult()
        {
           
           {
                double result = 0;
                result = NumberA - NumberB;
                return result;
           }
        }
    }
    class OperationMul : Operation
    {
        public override double GetResult()
        {

            {
                double result = 0;
                result = NumberA * NumberB;
                return result;
            }
        }
    }
    class OperationDiv : Operation
    {
            public override double GetResult()
            {
                double result = 0;
                if (NumberB == 0)
                    throw new Exception("除數不能為0");
                    result =NumberA/NumberB;
                    return result;



        }
        }
    }
    public class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;
        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }

        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }

        }
        public virtual double GetResult()
        {
            double result = 0;
            return result;

        }
    }

開閉原則,它指導我們如何建立一個穩定,靈活的系統。在軟體增加需求時,不去修改原有的程式碼只是擴充套件行為來實現變化。

今天就總結到這。如果有不合適的地方,請多多指正。謝謝。