SOLID的意思是:

  • Single responsibility principle 单一职责原则
  • Open/close principle 开放/封闭原则
  • Liskov substitution principle 里氏替换原则
  • Interface segregation principle 接口分离原则
  • Dependency inversion principle 依赖倒置原则

简解:

  单一职责原则:

    一个类应该只有一个被改变的理由,也就是类应该只有一个职责。

  开放/封闭原则:

    类、方法、模块等应该对扩展开发,对修改封闭。

  里氏替换原则:

    子类可以扩展父类的功能,但不要去改变父类原有的功能。

  接口分离原则:

    创建更精细的接口供客户程序使用。

  依赖倒置原则:

    模块不依赖它需要的模块。而是依赖于抽象的定义。

详解:

  单一职责原则:

    在定义一个类时,让其只有一个职责就行了。

    来举例说明,错误的示例:

    Class A //供别人使用的低级功能类

    {

      Say(String s)

      {

        //具体实现

      }

    }

    Class B //B类是重点,此类的实现违背了单一职责原则,它现在有两个职责,一是管理A的绳命周期,二是自己的业务逻辑。

    {

      A a;

       Public B()

      {

        a = new A();

      }

      

        void SayWrong()

      {

        A.Say("老头子他又错了");

      }

    }

    B类正确的设计:    

    Class B //B类这样就正确了,只有了自己的业务逻辑单一职责,管理A的绳命周期交给别的类去实现。

    {

      A a;

       Public B(A a)

      {

        this.a = a;

      }

      

        void SayWrong()

      {

        A.Say("我哪错了啊");

      }

    }

   开放/封闭原则:

    平时我们使用控件时,如Button类,把它看做基类,利用继承可以制作自己特别功能的按钮(对扩展开放),但是不要直接修改Button类,即使你有Button类的源码也不要修改(对修改封闭)。这就是开闭原则的一个应用。

  里氏替换原则:

    里氏是个妇女的姓氏,替换的意思详看下面的例子    

    class Program
    {
      static void Main(string[] args)
      {
        ISpeak iSpeak = new EnglishSpeak();//此处或是 new ChineseSpeak();
        iSpeak.Say();//当调用Say方法时,iSpeak指向的是EnglishSpeak实例就显示“英国话”,同理,指向ChineseSpeak实例就显示“中国话”
        Console.ReadKey();
       }
    }

    interface ISpeak
    {
      void Say();
    }

    class ChineseSpeak:ISpeak
    {
      public void Say()
      {
        Console.WriteLine("中国话");
      }
    }

    class EnglishSpeak : ISpeak
    {
      public void Say()
      {
        Console.WriteLine("英国话");
      }

    }

    替换是利用多态实现的。ChineseSpeak和EnglishSpeak类都有ISpeak定义的Say方法,在客户端程序的Main中,你想替换成哪个具体实现类都成。里氏替换的约束是子类只是去实现父类的约束。如果父类是类不是接口的话,不要去覆盖父类已经实现的方法,可以覆盖父类的抽象方法。

  接口分离原则:

    举个列子:

    interface A

    {

      a();

      b();

      c();//如果c不是客户端常用的方法  

    }

    应该把接口A拆分成:    

    interface A

    {

      a();

      b();

    }

    interface B

    {

      c();

    }

    这样的好处是,如果方法特别多,客户端使用时看到很多方法闹眼睛。

    class clent()

{

      B ib;

      publc(B ib)

      {

        this.ib = ib;

}

      public void clentC()

      {

        ib.C();

       }

}

  依赖倒置原则:

    错误的示例:    

    Class A //供别人使用的低级功能类

    {

      Say(String s)

      {

        //具体实现

      }

    }

    Class B //B类完全依赖A类,如果A类改了,B类就得改。

    {

      A a;

       Public B(A a)

      {

        this.a = a;

      }

      

        void SayWrong()

      {

        A.Say("我哪错了啊");

      }

    }

    正解:    

    interface iA

    {

      Say(String s);

    }

    Class A:iA //供别人使用的低级功能类

    {

      Say(String s)

      {

        //具体实现

      }

    }

    Class B //B类现在依赖的是iA这个接口,A类的实现也得按照这个接口来。大家都遵循iA的约束。

    {

      iA a;

       Public B(iA a)

      {

        this.a = a;

      }

      

        void SayWrong()

      {

        A.Say("我哪错了啊");

      }

    }

    

  初学咋练,如有错误,多指教。

面向对象设计原则-SOLID的更多相关文章

  1. 【转】面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  2. 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  3. OOD 面向对象面试干货分享| 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. 简写 全拼 中文翻译 SRP The Single Res ...

  4. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. 面向对象设计原则OO

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  6. (转)Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  7. Java程序员应当知道的10个面向对象设计原则

    面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...

  8. [译]Java 程序员应该了解的 10 个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  9. 【Java工程师之路】[1-2.2]Java10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

随机推荐

  1. 系列文章(二):从WLAN的安全威胁,解析电信诈骗的技术症结——By Me

    导读:互联网的无线接入已经成为大趋势,其中无线局域网(又称为WLAN,Wireless Local AreaNetwork)以其使用方便.组网灵活.可扩展性好.成本低等优点,成为互联网特别是移动互联网 ...

  2. table实现 js数据访问 传递json数据用render_to_response

    $(document).ready(function(){ $.ajax({ url:'/query/', dataType:'json', type:'GET', success:function( ...

  3. delphi webbrowser post自动登录

    delphi webbrowser post自动登录     var  EncodedDataString: WideString;  PostData: OleVariant;  Headers: ...

  4. git分支更新代码命令

    第一步: 查看状态  git status 第二步: 全部添加  git add --all 第三步: 再次查看状态  git status 第四步: 提交      git commit -m '备 ...

  5. Hbase1.2.4概述

    安装Hbase的时候,需要注意版本与Hadoop的版本兼容,具体查看:https://hbase.apache.org/book.html#basic.prerequisites 如下图: 我的Had ...

  6. $git学习总结系列(4)——gitignore文件

    有时候工作区中会有我们创建的一些密码配置文件,或者自动生成的一些临时文件,比如python代码编译产生的.pyc文件和java代码编译产生的.class文件等,我们在提交代码的时候没有必要把这些文件也 ...

  7. javascript Date对象 之 设置时间

    之前对js的date对象总是感觉熟悉,而不愿细细深究其所以然,所以每当自己真正应用起来的时候,总会糊里糊涂的,今日花费2个小时的时间仔细钻研了一下,感觉 豁然开朗,故,以此记录,一来 供以后查阅,二来 ...

  8. JavaScript的消息机制

    JavaScript本身是单线程的,但它却是事件驱动的.类似Windows窗体应用程序,它也需要消息队列机制来实现.程序的执行并不是连续的,绝大多数时间都在等待消息.每次执行执行程序都是在响应消息,这 ...

  9. Android bluetooth介绍

    Android bluetooth介绍(一):基本概念及硬件接口Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程Android blueto ...

  10. PHP memcache扩展模块安装

    安装php扩展模块memcache memcache 的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率,减轻后端数据库的读写压力. ...