(C#设计模式学习笔记)二、面向对象设计的七大原则及单一职责原则、开放封闭原则分析

一、面向对象的七大设计原则

设计原则名称 设计原则简介
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();
        }
    }
}

你可能感兴趣的:(设计模式,设计模式,面向对象编程,c#)