美文网首页
面向对象的六大原则

面向对象的六大原则

作者: 蜗牛的赛跑 | 来源:发表于2016-08-23 14:01 被阅读0次

    单一职责(Single Responsibility Principle)

    定义:一个类应该是一组相关性很高的函数、数据的封装

    通俗的说,即一个类只负责一项职责
    这个概念很抽象,但是如果没有看过任何设计模式的程序员,也会觉得理所当然,因为谁也不想一个类中塞满乱七八糟的代码

    开闭原则(Open Close Principle)

    定义:软件中得对象(类、模块、函数等)应该对于扩展是开放的,对于修改是关闭的。

    也是抽象的描述,可以理解为用抽象构建框架,用实现扩展细节

    里氏替换原则(Liskov Substitution Principle)

    定义:所有引用基类的地方必须能透明的使用其子类的对象。

    这也是我们经常遇到的,在代码中使用泛型,然后在具体情况下传递进其子类,在泛型使用的地方�都能安全的替换成子类

    依赖倒置原则(Denpendence Inversion Principle)

    定义:

    • 高层次模块不应该依赖低层次模块,两者都应该依赖其抽象

    • 抽象不应该依赖细节

    • 细节应该依赖抽象

    有个场景是这样,母亲要给孩子讲故事,给一本书,她就可以给孩子讲故事,代码如下:

    class Book{
        public String getContent(){
            return "很久很久以前有只戴眼镜的蛤蟆……";
        }
    }
    
    class Mother{
        public void narrate(Book book){
            System.out.println("妈妈开始讲故事");
            System.out.println(book.getContent());
        }
    }
    
    public class Client{
        public static void main(String[] args){
            Mother mother = new Mother();
            mother.narrate(new Book());
        }
    } 
    

    假如有一天,需求变成这样:不是给书而是给一份报纸,让这位母亲讲一下报纸上的故事,报纸的代码如下:

    class Newspaper{
        public String getContent(){
            return "G20在杭州...";
        }
    } 
    

    但是,母亲却不会读报纸,这显然不合理。
    发生这样的原因是因为高层次模块不应该依赖低层次模块,两者都应该依赖其抽象
    所以我们将报纸,书等读物抽象出来,并且让细节应该依赖抽象

    interface IReader{
        public String getContent();
    } 
    
    
    class Newspaper implements IReader {
        public String getContent(){
            return "G20在杭州...";
        }
    }
    class Book implements IReader{
        public String getContent(){
            return "很久很久以前有只戴眼镜的蛤蟆……";
        }
    }
    
    class Mother{
        public void narrate(IReader reader){
            System.out.println("妈妈开始讲故事");
            System.out.println(reader.getContent());
        }
    }
    
    public class Client{
        public static void main(String[] args){
            Mother mother = new Mother();
            mother.narrate(new Book());
            mother.narrate(new Newspaper());
        }
    }
    

    依赖倒置从UML图中可以更好地看出(在网上找了图片)

    2012020716284481.jpg 2012020716302379.jpg

    高层模块依赖于抽象的模块,所谓的依赖倒置就是指这个

    接口隔离原则(Interface Segregation Principle)

    定义:客户端不应该依赖它不需要的接口
    另一种定义:类间的依赖关系应该建立在最小的接口上

    这也是显而易见的,如果接口过于臃肿,以至于实现类完全没有必要实现接口的所有功能,那么这样的设计是不合理的.

    基本原则

    单一职责、开闭原则、里氏替换、接口隔离以及依赖倒置5个原则被定义成SOLID原则.这几个原则最终可以化成几个关键字:抽象、单一职责、最小化

    迪米特原则(Law of Demeter)

    定义:一个对象应该对其他对象有最少的了解

    这也是显而易见的,用户不需了解细节,即可使用类
    后续的外观模式就是迪米特原则的体现

    相关文章

      网友评论

          本文标题:面向对象的六大原则

          本文链接:https://www.haomeiwen.com/subject/okogsttx.html