开闭原则(Open Closed Principle)
开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。如当一个模块需要修改的时,不应该直接修改源代码,这样有可能对现有的工作造成影响。应该通过拓展来实现新需求。
例如,
1)一般的反面设计实现
using System;
namespace ConsoleApplication
{
/// <summary>
/// 矩形(Shape.cs)
/// </summary>
public class Shape
{
private double _width;
private double _height;
private double _radius;
private string _name;
public Shape(string name, double width, double height)
{
this._width = width;
this._height = height;
_name = name;
}
public double AreaRectangle()
{
return _width * _height;
}
public void DisplayRectangle()
{
Console.WriteLine("{0} 长:{1},宽:{2},面积:{3}", _name, _width, _height, this.AreaRectangle());
}
public Shape(string name, double radius)
{
this._radius = radius;
this._name = name;
}
public double AreaCircle()
{
return Math.Round(Math.PI * _radius * _radius);
}
public void DisplayCircle()
{
Console.WriteLine("{0} 半径:{1},面积:{2}", _name, _radius, this.AreaCircle());
}
}
class Program
{
static void Main(string[] args)
{
Shape circle = new Shape("圆", 1);
circle.DisplayCircle();
Shape rectangle = new Shape("正方形", 100, 100);
rectangle.DisplayRectangle();
Console.ReadKey();
}
}
}
2)开闭原则的实现
using System;
namespace ConsoleApplication
{
//Shape.cs
public abstract class Shape
{
protected string _name;
public Shape(string name)
{
this._name = name;
}
/// <summary>
/// 面积
/// </summary>
/// <returns></returns>
public abstract double Area();
/// <summary>
/// 显示
/// </summary>
public abstract void Display();
}
/// <summary>
/// 矩形(Rectangle.cs)
/// </summary>
public class Rectangle : Shape
{
private double _width;
private double _height;
public Rectangle(string name, double width, double height)
: base(name)
{
this._width = width;
this._height = height;
}
public override double Area()
{
return _width * _height;
}
public override void Display()
{
Console.WriteLine("{0} 长:{1},宽:{2},面积:{3}", _name, _width, _height, this.Area());
}
}
/// <summary>
/// 圆形(Circle.cs)
/// </summary>
public class Circle : Shape
{
private double _radius;
public Circle(string name, double radius)
: base(name)
{
this._radius = radius;
}
public override double Area()
{
return Math.Round(Math.PI * _radius * _radius);
}
public override void Display()
{
Console.WriteLine("{0} 半径:{1},面积:{2}", _name, _radius, this.Area());
}
}
class Program
{
static void Main(string[] args)
{
Shape circle = new Circle("圆", 1);
circle.Display();
Shape rectangle = new Rectangle("正方形", 100, 100);
rectangle.Display();
Console.ReadKey();
}
}
}