开放封闭原则(Open Closed Principle)描述

一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。

开闭原则时面向对象设计的核心所在

遵循这个原则可以带来面向对象技术所声称的巨大好处, 也就是可维护, 可扩展, 可复用, 灵活性好. 开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象.

符合开放封闭原则的模块都有两个主要特性:

  1. 它们 "面向扩展开放(Open For Extension)"。
    模块的行为是能够被扩展的. 当应用程序的需求变化时, 我们可以使模块表现出全新的或与以往不同的行为, 以满足新的需求.

  2. 它们 "面向修改封闭(Closed For Modification)"。
    模块的源代码是不能被侵犯的, 任何人都不允许修改已有源代码.

开放封闭原则的实例

开放封闭原则C#001

using System;
using System.Collections.Generic;
using System.Text;

namespace 开放封闭原则001
{
	// 果树接口
    public interface Fruit
    {
        void Plant();
        void Blossom();
        void Outcome();
    }
    
	// 苹果树
    public class Apple : Fruit
    {
        public Apple()
        {
            this.Plant();
            this.Blossom();
            this.Outcome();
        }
        
        public void Plant()
        {
            Console.WriteLine("种一棵苹果树.");
        }
        
        public void Blossom()
        {
            Console.WriteLine("苹果树开花了.");
        }
        
        public void Outcome()
        {
            Console.WriteLine("苹果树收获了.");
        }
    }
    
	// 梨树
    public class Pear : Fruit
    {
        public Pear()
        {
            this.Plant();
            this.Blossom();
            this.Outcome();
        }
        
        public void Plant()
        {
            Console.WriteLine("种一查梨树.");
        }
        
        public void Blossom()
        {
            Console.WriteLine("梨树开花了.");
        }
        
        public void Outcome()
        {
            Console.WriteLine("梨树收获了.");
        }
    }
    
	// 果农接口
	public interface GardenerBase
    {
        Fruit GetFruit();
    }
    
	// 苹果
    public class AppleGardener : GardenerBase
    {
        private static AppleGardener appleGardenerSingleton;
        
        private AppleGardener()
        { }
        
        public static AppleGardener GetGardener()
        {
            if (appleGardenerSingleton == null)
            {
                appleGardenerSingleton = new AppleGardener();
            }
            
            return appleGardenerSingleton;
        }
        
        public Fruit GetFruit()
		{
			return new Apple();
		}
    }
    
        public class PearGardener : GardenerBase
    {
        private static PearGardener pearGardenerSingleton;
        
        private PearGardener()
        { }
        
        public static PearGardener GetGardener()
        {
            if (pearGardenerSingleton == null)
            {
            	pearGardenerSingleton = new PearGardener();
            }
            
            return pearGardenerSingleton;
        }
            
        public Fruit GetFruit()
        {
            return new Pear();
        }
    }
    
	class Program
    {
        static void Main(string[] args)
        {
            Fruit tempApple;
            GardenerBase appleGarden = AppleGardener.GetGardener();
            tempApple = appleGarden.GetFruit();
            
            Fruit tempPear;
            GardenerBase pearGarden = PearGardener.GetGardener();
            tempPear = pearGarden.GetFruit();
        }
    }
}

Q.E.D.