zoukankan      html  css  js  c++  java
  • 面向对象编程的思想(5)未完成

    合成/聚合复用原则是面向对象设计对象复用的主要形式

    名称:合成/复用原则(Dependence Inversion Principle)DIP

    核心:要依赖抽象,不要依赖于具体实现。换言之:通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不相互影响,从而实现模块间的松散耦合。

    规范:(1)每个类尽量都继承自接口或抽象类,或者二者都有。

    (2)变量的显式类型尽量是接口或抽象类。

    (3)类要尽量避免从具体类派生。

    (4)尽量不要覆盖抽象基类中已实现的方法。

    实现: (1)通过构造函数传递依赖对象

    (2)通过setter方法传递依赖对象

    (3)接口声明实现依赖对象

    例子:例如我们设计一个Tutu类:

     1publicclass Tutu{
        //图图是个女孩,会煮面
        publicvoid cook(Noodles noodles){
            noodles.eat();  
        }    

    设计一个Noodles类实现吃面条的行为:

    1publicclass Noodles{
        //吃面条
        publicvoid eat(){
            System.out.println("吃面条!");
        }    
    }  


    客户端测试代码:

    1publicclass HomeTutu{
        publicstaticvoid main(String[] args){
            Tutu tutu = new Tutu();
            Noodles food =new Noodles();
            tutu.cook(food);
        }
    }

    运行结果:

    吃面条!

    这种设计方式就违反了依赖倒置原则,如果需要改变吃面的举动,就需要修改代码才能,不能单纯通过添加代码实现。标准方式如下(通过接口):

    设计一个做饭的接口ITutu定义行为:

    1publicinterface ITutu{
        //这样就能做各种饭菜
        publicvoid cook(IFood food);

    设计一个Tutu类实现ITutu接口,实现动作行为:

     1publicclass Tutuimplements ITutu{
        @Override
        publicvoid cook(IFood food){
            food.eat();
        }
    }
    设计一个IFood接口,定义eat方法:

     1publicinterface IFood{
        publicvoid eat();
    设计一个Noodles类实现IFood接口,重写eat动作行为:
    1publicclass Noodlesimplements IFood{
        @Override
        publicvoid eat(){
            System.out.println("吃面条!");
        }
    }
    设计一个Rice类实现IFood接口,重写eat动作行为:
    1publicclass Riceimplements IFood{
        @Override
        publicvoid eat(){
            System.out.println("终于可以吃米饭了!");
        }
    }

    客户端测试代码:

    1publicclass HomeTutu{
        publicstaticvoid main(String[] args){
            //接口不能直接实例化,需要借助于类
            ITutu tutu =new Tutu();
            IFood rice =new Rice();
            tutu.cook(rice);
            IFood noodles =new Noodles();
            tutu.cook(noodles);
        }
    10 }
    ~     

    运行结果:

    终于可以吃米饭了!
    吃面条!
    请按 ENTER 或其它命令继续

    在这个过程中,通过不同的类Noodles和Rice实现接口IFood,达到了不通过修改代码而使业务逻辑发生改变的方法。

    总结:上边的MimiCat类作为Cat的子类,复用Cat和Animal的代码。并在父类的基础上添加新的行为。在面向对象的编程中,继承是抽象化的具体实现。

    优点:开放封闭原则的核心是面向抽象编程,而不是面向具体编程,抽象是相对稳定的,让类依赖与抽象,对修改来说就是封闭的。面向对象编程中的继承及多态机制,可以实现对抽象体的继承,重写方法改变其固有行为,实现新的方法,达到扩展开放的目标。

    后记:面向对象编程中,通过继承实现对类的扩展,实现封闭修改和扩展开发的目地。


  • 相关阅读:
    python3 装饰器
    Python3 迭代器与生成器
    Python3 循环
    Python3 条件控制
    Python3 字典
    Python3 元组
    Python3 列表
    08.HttpUrlconnection方式调用
    南海区行政审批管理系统接口规范v0.3(规划)
    day63-webservice 11.cxf整合spring
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6823168.html
Copyright © 2011-2022 走看看