设计模式之开放封闭原则
1、定义
软件实体(类,函数,模块等)应该可以扩展,但是不可以修改。
2、两个特性
1.对于扩展是开放的:意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
2.对于修改是封闭的:意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
3、何时应对变化
绝对的对修改关闭是不可能的,无论模块多么的“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对那种变化封闭做出选择。他必须猜测数最有可能发生变化的类,然后构造抽象来隔离变化。
4、实例
增加开方和求绝对值功能,只需要在之前的代码基础上添加开方与求绝对值的类,而不需要更改原来代码:
抽象父类:
//一个抽象的计算父类
public abstract class Operation
{
public double NumberA { get; set; }
public abstract double GetResult();
}
添加开方与求绝对值子类:
//一个开方的子类
public class Sqrt : Operation
{
public override double GetResult()
{
return Math.Sqrt(NumberA);
}
}
//一个求绝对值的子类
public class Abs : Operation
{
public override double GetResult()
{
return Math.Abs(NumberA);
}
}
在原来的操作工厂添加这两个case即可:
//计算工厂类
public static class OperationFactory
{
public static Operation CreateOperate(string operatestring)
{
Operation oper = null;
switch (operatestring)
{
//原来基础上新增
case "sqrt":
oper = new Sqrt();
break;
case "abs":
oper = new Abs();
break;
}
return oper;
}
}