开放--封闭原则
开放封闭原则定义
一个软件实体应当对扩展开放,对修改关闭,也就是说在设计一个模块的时候,应当使这个模块
在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
举例:软件实体,如类、模块、功能等,应当对扩展开放,但是对修改关闭。即一个现有工程完毕后,
之后所有新添加的功能应当在不修改原有代码的基础上进行,不应当在已有代码上进行任何代码的修改,
或者逻辑上修改添加操作。
注意:不允许更改系统的抽象层,允许更改系统的实现层。
开放封闭原则分析
1.在开闭原则中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
2.其中,抽象性是开闭原则的关键。
3.开闭原则可通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则要求找到系统的
可变因素并将其封装起来。
我们需要在开发工作开始不久就知道可能发生的变化,查明可能发生的变化所等待的时间越
长,要创建正确的抽象就越困难,开闭原则是面向对象设计的核心所在。
遵循开闭原则使程序可维护、可扩展、可复用,灵活性好。开发人员仅对程序中呈现出频繁变化的
部分做出抽象。拒绝刻意抽象,不成熟抽象,防止物极必反。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 开闭原则
{
public interface Fruit
{
void Plant();
void Blossom();
void Outcome();
};
public class Apple : Fruit
{
public Apple()
{
this.Plant();
}
public void Blossom()
{
Console.WriteLine("种一棵苹果树");
}
public void Outcome()
{
Console.WriteLine("苹果树开花");
}
public void Plant()
{
Console.WriteLine("苹果收获了");
}
}
public class Pear : Fruit
{
public Pear() { }
public void Blossom()
{
Console.WriteLine("种一棵梨树");
}
public void Outcome()
{
Console.WriteLine("梨树开花");
}
public void Plant()
{
Console.WriteLine("梨树收获了");
}
}
public interface GardenBase
{
Fruit GetFruit();
}
public class AppleGarden : GardenBase
{
private static AppleGarden appleGardenSingleton;
private AppleGarden() { }
public static AppleGarden GetAppleGarden()
{
if (appleGardenSingleton == null)
{
appleGardenSingleton= new AppleGarden();
}
return appleGardenSingleton;
}
public Fruit GetFruit()
{
return new Apple();
}
}
public class PearGarden : GardenBase
{
private static PearGarden pearGardenSingleton;
private PearGarden() { }
public static PearGarden GetPearGarden()
{
if (pearGardenSingleton == null)
{
pearGardenSingleton = new PearGarden();
}
return pearGardenSingleton;
}
public Fruit GetFruit()
{
return new Apple();
}
}
internal class Program
{
static void Main(string[] args)
{
Fruit tempApple;
GardenBase appleGarden=AppleGarden.GetAppleGarden();
tempApple=appleGarden.GetFruit();
Fruit tempPear;
GardenBase pearGarden = PearGarden.GetPearGarden();
tempPear = appleGarden.GetFruit();
}
}
}