开闭原则(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(); } } }