设计模式六大原则是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。它们不是要我们刻板的遵守,而是根据实际需要灵活运用。只要对它们的遵守程度在一个合理的范围内,努为做到一个良好的设计。本文主要介绍一下.NET(C#) 开闭原则。
开闭原则(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.cspublic 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();}}
}