一、面向对象的七大设计原则
设计原则名称 | 设计原则简介 |
---|---|
1.单一职责原则(SRP) | 类的职责要单一,不能将太多的职责放在一个类中 |
2.开闭原则 (OCP) | 软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能 |
3.里式代换原则(LSP) | 在一个可以接受基类对象的地方必然可以接受一个子类对象 |
4.依赖倒转原则(DIP) | 要针对抽象层编程,而不要针对具体类编程 |
5.接口隔离原则(ISP) | 使用多个专门的接口来取代一个统一的接口 |
6.合成复用原则(CRP) | 在系统中尽量多使用组合和聚合关联关系,尽量少使用甚至不适用继承关系 |
7.迪米特法则(LOD) | 一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引用一个第三者发生间接交互 |
二、单一职责原则
1.定义:一个对象只包含单一的职责,并且该职责被完整的封装在一个类中。
分析:一个类承担的职责越多,他被复用的可能性越小,而且如果一个类承担的职责过多,就相当于将这些职责耦合到一起,当其中一个职责变化时,可能会影响其他职责运作。
单一职责原则是实现高内聚、低耦合的指导方针。
2.优点:类的复杂性降低,可读性高,可维护性提高,变更引起的风险降低
三、开放封闭(开闭)原则
1.定义:一个软件应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块行为。
抽象画是开闭原则的关键。
2.优点:开闭原则是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该对程序中频繁出现变化的那些部分作出抽象。
3.实例
namespace _2.开放封闭原则实例
{
public interface Fruit
{
void Plant();
void Blossom();
void Outcome();
}
public class Apple:Fruit
{
public Apple() //构造函数
{
this.Plant();
this.Blossom();
this.Outcome();
}
public void Blossom()
{
Console.WriteLine("苹果树开花");
}
public void Outcome()
{
Console.WriteLine("苹果树结果");
}
public void Plant()
{
Console.WriteLine("种一颗苹果树");
}
}
public class Pear : Fruit
{
public Pear() //构造函数
{
this.Plant();
this.Blossom();
this.Outcome();
}
public void Blossom()
{
Console.WriteLine("梨树开花");
}
public void Outcome()
{
Console.WriteLine("梨树结果");
}
public void Plant()
{
Console.WriteLine("种一颗梨树");
}
}
public interface GardenerBase
{
Fruit GetFruit();
}
public class AppleGardener : GardenerBase
{
private static AppleGardener appleGardenerSingleton; //单例模式
private AppleGardener()
{
}
public static AppleGardener GetGardener()
{
if(appleGardenerSingleton==null)
{
appleGardenerSingleton = new AppleGardener();
}
return appleGardenerSingleton;
}
public Fruit GetFruit()
{
return new Apple();
}
}
public class PearGardener:GardenerBase
{
private static PearGardener pearGardenerSingleton;
private PearGardener()
{
}
public static PearGardener GetGardener()
{
if(pearGardenerSingleton==null)
{
pearGardenerSingleton = new PearGardener();
}
return pearGardenerSingleton;
}
public Fruit GetFruit()
{
return new Pear();
}
}
class Program
{
static void Main(string[] args)
{
Fruit tempApple;
GardenerBase appleGardener = AppleGardener.GetGardener();
tempApple = appleGardener.GetFruit();
Fruit tempPear;
GardenerBase pearGardener = PearGardener.GetGardener();
tempApple = pearGardener.GetFruit();
Console.ReadKey();
}
}
}