加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

当人工智能(AI)遇见物联网(IoT)

发布时间:2021-02-16 15:53:25 所属栏目:传媒 来源:互联网
导读:## GOF设计模式 设计模式的流行源于一本叫《设计模式:可复用面向对象软件的基

## GOF设计模式

设计模式的流行源于一本叫《设计模式:可复用面向对象软件的基础》的书,这本书的作者是4个博士,也叫GOF(Gang of Four),软件设计模式一词由作者从建筑设计领域引入计算机科学。

书中介绍了 23 种设计模式。这些模式可以分为三大类:

  • + 创建型模式:单例、原型、工厂方法、抽象工厂、建造者
  • + 结构型模式:代理、适配、桥接、装饰、外观、享元、组合
  • + 行为型模式:模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器

## 合成复用原则

对于软件复用来说,组合优于继承,在软件复用时,优先考虑组合关系,其次才考虑继承关系。

面向对象设计的特点之一是继承,子类包含父类的所有属性和方法,因此一个很自然的想法是为了复用父类的代码而继承。但是实践发现,用继承关系来实现软件的复用有很多缺点,一般来说更为合理的方式是,用多个对象的组合关系来实现复用。

+ 继承关系是子类“是一个”父类的关系,但如果是为了复用父类的已有功能来实现子类的新功能,常常会违反里氏替换原则。

+ 组合关系更容易处理有多个可复用模块的情况。多重继承会导致结构复杂不易维护。

+ 组合关系更灵活易扩展,只要使用适当的设计模式,使用者和被使用者都可被修改、扩展、替换。

+ 组合关系可以提供运行时的灵活性。可以在运行时指定一个模块的底层实现,或者运行时替换一个对象的内部实现。

为了体现它的重要性,这里我们看一个具体的例子。

我们知道,队列是一种先进先出的数据结构。在队列上可以执行添加和删除一个元素的操作,添加元素称为入队,删除元素称为出队,并且元素出队的顺序与入队的顺序相同。显然,队列可以用双向链表来实现,那么,我们要不要把队列设计成双向链表的子类呢?

咋一看,可以让queue私有继承list,隐藏掉list所有的方法,然后实现队列的push方法调用list的push_pack方法,队列的pop方法调用list的pop_front方法。非常简单直接。

但是,这种实现方式是有问题的。到底啥问题?一言两语也讲不清楚,你自己想去吧。

因此,C++和Java的标准库都没有采用这种继承的方式实现队列。

在C++的stl中,queue被设计成一个容器适配器。只要是是实现了push_back、pop_front的容器,都可以作为queue的底层容器。stl中就提供了2种可以套用queue的容器,是list和deque。list就是双向链表。deque的实现是数组指针的数组,与list相比减少了内存分配的次数。

在JDK中,Queue是一个interface,实现了Queue接口的有LinkedList、ArrayDeque、ConcurrentLinkedQueue、LinkedBlockingQueue等许多具体类。

为了体现它的重要性,这里我将用一个实例来加深你对它的印象。如果设计一个网络组件库,HttpConnection应该继承TcpConnection吗?

HttpConnection不再能够提供符合TcpConnection的功能,不能当作TcpConnection使用。考虑read方法,若直接暴露TcpConnection的read方法,则破坏内部结构;若提供基于HTTP协议的read方法,又无法做到功能跟父类一致。

Http协议能够使用不同的下层协议,例如TCPv6。继承自TcpConnection就失去了这种扩展性。

如果设计另一个类"HttpOverTcp6Connection",会导致二者有大量的重复代码,而这些代码恰恰是实现HTTP协议本身的功能,应复用为好。

如果希望一个程序在IPv4和IPv6网络下都可使用,需要做很多的工作来实现在运行时(而非编译时)根据配置文件或用户输入选择HttpConnection或HttpOverTcp6Connection。

继承关系表达类的对外提供的功能,而非类的内部实现。Java中HttpURLConnection继承URLConnection,与之并列的是JarURLConnection,二者都提供了根据URL建立连接并通信的功能。

**下面以2个常用的设计模式为例,说明它们的应用场景和应用价值,让大家有一个比较直观具体的感受。**


(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读