开放封闭原则(Open Closed Principle)描述
一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
开闭原则时面向对象设计的核心所在
遵循这个原则可以带来面向对象技术所声称的巨大好处, 也就是可维护, 可扩展, 可复用, 灵活性好. 开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象.
符合开放封闭原则的模块都有两个主要特性:
-
它们 "面向扩展开放(Open For Extension)"。
模块的行为是能够被扩展的. 当应用程序的需求变化时, 我们可以使模块表现出全新的或与以往不同的行为, 以满足新的需求. -
它们 "面向修改封闭(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();
}
}
}