适配器模式 合成模式

《Java设计模式》根据意图对设计模式进行的分类,作为参考,如下:

 

这里介绍“接口型模式”中的适配器模式、合成模式,桥接模式。适配器模式与合成模式还是比较好理解的,关键是桥接模式。

 

适配器模式:对适配器的概念源于电子通信,一般意义上的理解就是两个东西不匹配了,比如型号、速度等,拿个适配器转换一下,这里适配器的概念是类似的。在《Java设计模式》中举得一个例子就是客户端(client,要调用我们的程序)与我们的代码同时开发,结果导致接口不一致,客户端希望调用的接口我们没提供,但是我们还是实现了期望的功能的。这个时候就需要使用适配器模式了,来适配一下。

适配器模式的意图在于:使用不同接口的类所提供的服务为客户端提供它所期望的接口

适配器模式分为两类,接口适配和对象适配。

先看接口适配:接口适配是指,客户端提供了一个期望调用的接口(interface),假设这个interface为RequiredInterface,然后我们这个类为ExistingClass。这个时候我们可以创建一个适配器类(称之为NewClass),这个适配器类实现了客户端的接口,同时继承了我们的类,这样,这个NewClass就可以提供给客户端使用了,即通过实现继承的方式。类结构如下:

        

类与对象适配器:在这种适配器下,客户端并没有提供接口,而且只有一个类,那我们可以为客户端的类设计一个子类,并且这个子类持有我们的功能类的一个引用,即通过继承引用的形式。结构如下:

 

合成(Composite)模式:合成模式的英文是Composite,是一组对象的组合,这些对象可以是容器对象,表现为的概念;另外一些对象则代表了单对象,或称为叶子对象。在对组合进行建模的时候,必须注意两个重要概念第一个概念是组对象允许包含单对象,也可以包含其他的组对象。第二个概念则要为组合对象和单对象定义共同的行为。结合这两个概念,就可以为组对象与单对象定义统一的类型,并将该组对象建模为包含同等类型对象的集合。

    合成模式的意图是为了保证客户端调用单对象与组合对象的一致性

    下图展示了一个经典的组合结构。Leaf类和Composite类都实现自同一个抽象的Component通用接口,同时,Composite对象又包含了其他的Composite和对象的集合。


(注意:上图中三角形表示继承,空心菱形表示聚合,聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分,不是整体与部分的关系(组合是)。这里就是说明Composite对象持有一个Component类型的集合,既然是抽象类型,那么元素可以是Leaf类型,也可以是Composite类型。)

合成模式中的递归行为:《Java设计模式中》以机器说明了这个问题,单台机器Machine是一个leaf,多台机器MachineComposite是一个合成Composite,这样在调用getMachineCount()时,单台机器返回1,但是对于多台机器的组合MachineComposite需要递归调用每个元素的getMachineCount(),注意单纯不能返回每个集合的大小,因为集合的类型有可能还是Composite。

组合、树与环:在合成结构中,如果一个节点拥有对其他节点的引用,则该节点就是一棵树,这个也可能不是真正的树,当一个节点仅有一个父节点时才是真正的树,如下图就不是树,

当数据结构不是严格的树的时候,递归访问可能就会出现问题,比如在上面图中递归调用getMachineCount就会有问题,如果允许非树结构合法,在编程的时候就需要特别注意,比如类似于对图的遍历,对一个节点不能访问两次等,对此也可以设置一个visited数组等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值