4-3 面向复用的设计模式

设计模式:前人经验总结出来的设计方案,可复用

创建型模式:告诉我们怎么更好的创建对象,第五章。

结构型模式:研究结构,怎么把类、对象更好的组合在一起。

行为类模式:研究对象、类怎么进行调度,怎么更好的分配职责、实现功能。

一、结构性模式

(1)适配器模式:
  解决类之间接口不兼容问题,即类是以一种方式实现的,但用户想用一种不同的方式调用(例如签名不同)。
  方法:通过增加一个接口,对已存在的类进行封装。
  适配器的两种方式:委托和继承
  委托:
  客户端(client)的调用和存在的类(LegacyRectangle)的接口不同,这时声明一个interface(Shape),Shape的实现类通过委托的方式,调用LegacyRectangle的方法实现适配,这个实现类就是适配器。
在这里插入图片描述

  客户端调用这个原本存在的类(LegacyRectangle)时要通过调用适配器:
在这里插入图片描述
(2)装饰器模式:
  假如说一个东西他有很多的特性(或者说功能),例如特性a、b、c、d;那如果需要这个东西的子类能够拥有部分特性,比如说子类X有特性a、b,子类Y有特性b、c、d,那应该怎么实现?
  继承肯定是不适合,如果搞一个接口它有所有的这些特性,而某个子类只需要其中的部分属性,但继承的话就要继承所有的特性,这样显然不好,会有很多空函数。
  或者给每个特性构造一个类,但由于java不支持多继承,故也无法实现任意特性的组合;
  或者将所有特性的组合构造一个类,这样显然会组合爆炸,且有大量代码重复。
  装饰器模式:为每一个特性构造一个子类,将特性通过委派机制增加到对象上,形式是递归地,就是一个一个功能地加。
  形式如下:对于一个对象component,先有一个基本地实现类ConcreteComponent,然后Decorator是逐渐地对于这个component加特效(雾),呃加特性。每一个具体地Decorator可以对其加一个特效(雾)。
在这里插入图片描述
例如,构建一个有三个特效的栈:
在这里插入图片描述在这里插入图片描述
ecorator是面向对象,run time;继承是编译时。
decorator的例子:集合的unmodifiable();

(3)façade:
  提供一个统一的、简化的接口,来取代对一系列小的接口的调用,相当于对一大堆接口做了封装

二、行为模式

(1)策略模式:
   背景:
在这里插入图片描述
  解决方案:
  为算法构造一个总的接口,不同的算法实现一个具体的类,利用委托,运行时动态传入客户端需要的算法,例如List。
  举例:
  ShoppingCart是一个需要调用pay算法的类,pay算法有一个接口PaymentStrategy,这个接口有两个实现类,分别是用信用卡支付和用支付宝支付。

在这里插入图片描述
  pay的实现就是委托给这个接口:
在这里插入图片描述
  调用时若需要不同的支付方式,只需要向pay传不同类型的算法即可:
在这里插入图片描述
(2)模板模式:
  解决的问题:做某件事情的步骤一样,但每个步骤的具体做法不同。
  解决方案:共性的步骤、步骤的顺序在抽象类中实现,差异化的步骤在各个子类中实现。
  实现方式是继承和重写
  抽象类中实现了规定各步骤顺序的函数:templateMethod,其子类实现具体的各个步骤:step1、step2、step3:
在这里插入图片描述
  使用时对于不同子类,调用方法相同,直接调用规定各步骤顺序的templateMethod方法即可:
在这里插入图片描述
  显然模板模式时应用在框架中的,而且是白盒框架,子类实现这个框架中的抽象的方法,然后框架调用他们。

(3)迭代器模式:
  这是客户端通用的能够遍历一组在容器中的ADT的方式,而不需要关心这个容器的基本类型。
  模式的结构:
  由一个构造迭代器的接口(左)和迭代器接口(右)组成,各自的接口有各自的实现类:
在这里插入图片描述
  如果一个集合类实现了Iterable接口和迭代器,就可以进行显式或隐式的遍历,隐式就是使用for循环:
在这里插入图片描述
  不同的类可以实现自己的迭代器:
在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值