zoukankan      html  css  js  c++  java
  • 设计模式是用来弥补面向对象编程缺陷的方法总结

    面向对象和设计模式都是大家耳熟能详的概念。面向对象是以对象为基本元素,对数据与逻辑行为进行封装。实现面向对象过程的方法是使用抽象,同时在使用抽象进行分析设计的时候就产生了类型,并隔离了抽象与实现。这个过程是有很多的优点的,熟话说得好,完美的东西肯定也有不足。因此我们这里要讨论的是面向对象的缺点,以及设计模式就是用来弥补这些缺陷的方法总结。

    抽象是特殊到一般的过程。在这个过程中会忽略对象的个性而归纳出共性。不过对象实例在行为上不仅仅有共性,还有一些自己的特性。如何继承共性,保持自己的个性也一直是面向对象编程需要实际结局的问题。

    抽象是灵丹也带来如何创建具体实现的问题

    面向对象使得对象有抽象与实现之分,并在实现中变化,而用抽象来应对变化(也就是抽象是不变这个假设)。首先实现有不同的具体实现,那么在运行时候需要采用哪种手段呢?在面向对象理论里面我没有找到与之对应的方法,反而在设计模式-创建型的模式里面比如抽象工厂等中找到创建产品具体实现。

    对象类型带来的苦恼

    由于抽象,对象实例与对象类型以及对象类型之上的泛型化的对象类型,产生了很多的对象类型层次。所以在实现的过程中需要判断具体的对象类型,根据具体的对象类型来调用相应的操作。而且这在C++里面还有一种专门的RTTI-也就是动态类型诊断技术。在C#里面运行时CLR里面也有TypeChecker这个组件。这种需要判断类型来进行交互的逻辑实现在对象理论里面也没有具体的方法。虽然多态方法能根据运行时的类型来动态决定那个具体的函数被调用,但是总是有些地方的逻辑是需要类型判断的。所以设计模式里面就有了相应的一些模式来弥补面向对象的不足。比如说每种对象类型都都封装自己的处理逻辑,然后借助反射来实现客户端与具体类型的解耦。

    对象实例如何体现个性

    对象实例是对象在运行时态的一个视图,由于我们使用面向对象的继承机制,所以往往看到的是对象的共性,而很少有个性。而且经常在使用继承的时候会犯一个不是错误的错误,那就是子类否决父类的方法(我不知道怎么表达这个意思比较好,就是一种子类型的行为不符合父类的行为,也就是违反经典的里氏替换原则)。客户端如何调用对象的个性呢?是向下转型成我们的子类型还是使用转换成行为接口呢?面向对象同样也没有解决方法,而设计模式之一的Visitor模式就很好解决了这个问题。这个时候客户端作为一个Vistor的实现去访问Vistable的子类,Vistable子类同样调用客户端Visitor,使得成为双向调用来解决子类个性行为问题。

    以上基本总结了由于抽象所带来的问题(个性与共性问题,对象类型层次),以及设计模式如何解决这里问题的方案。所以我们不能为了面向对象而面向对象。实际上面向对象与面向结构的各自的问题也是导致Linus C与C++争论的焦点问题的根源。

  • 相关阅读:
    es的多种term查询
    es的批量导入
    可重入锁
    常见的字段类型
    es中的分词
    搜索的简单使用
    application.properties中的list配置
    mysql中的concat的几个函数使用
    文档的增删改查
    Mxnet学习笔记(3)--自定义Op
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1768970.html
Copyright © 2011-2022 走看看