对Lab3设计模式的一些理解

Introduction

在本次实验中给出了值班管理,操作系统调度和课程安排三个具有共性的东西。
首先,提炼出一些共性。例如都是一个时间序列的集合,于是有了定义:

  • Intervalset接口:它用来表示元组(标签,时间段)。标签不能重复
  • MultiIntervalset接口:标签可以重复。

当然也会有一些差异:

  • 1场景不允许有空白,2,3允许有空白
  • 1,2中不允许有重叠,3允许有重叠
  • 3是周期性重复的时间段

对设计模式的理解

  • **所有特殊操作放入顶层的抽象接口:**很简单,当子类相应方法的规约不与接口一致,实现接口的子类中通过assert或空实现的方式直接不使用接口中的方式。显然是一种很Low的方式,具有很多的空实现。这是一种“自我欺骗”的形式,白白浪费了接口的作用,还增加了一大堆的臃肿代码。

  • **放入底层应用子类:**由于三个设计场景的共性还是较多,这样做使得每个应用的子类中都有重复的代码。例如,在操作系统调度和值班表的设计中,本质上都是将一个时间序列插入到特定的时间段中,不同之处在于一个允许空白,一个不允许空白。这样做显然降低了软件的可复用性,并且不利于维护。如果我们将来还有类似的场景,那么还需要再写一次同样的代码。

  • **不同的特征分别定义不同的接口:对于方案2的一种改进,增加了接口的抽象。但是对于每种接口都还是需要特别的方法来进行实现。这与方案2的缺陷是一致的。如图所示,在这三个接口中增加这些行为即可:
    在这里插入图片描述

  • 在3的基础上,继承并实现3中的接口:这种方式也就是在3的基础上加上了继承的操作。通过继承全局共性操作再一步一步地实现特征接口。在每一步实现的过程中仅仅去实现一个接口形成一个特定的类,下一个类再继承上一个类,并且这个下一个类再去实现一个接口。这样层层递进,最终达到我们的目标。这样做的好处是可以复用父类的代码(实质上是通过继承的方式)。而不是像3一样一个类直接实现所有的特征接口。例如,从我们最初实现Intervalset接口的类CommonSet开始,想要实现处理第一个场景的ADT。逐层向下继承:
    — 第一个子类继承Commonset并实现NonOverlap接口,这个接口仅提供了insert方法的一种重写形式,即抛出overlap的异常。该子类具有了处理重叠的能力。
    —第二个子类继承第一个子类并实现NoBlankIntervalset接口,该子类具有了处理重叠和空白的能力。但需要注意,这里处理空白的情况必须等待用户将所有信息输入完毕后再进行检查,而不是每次insert以后再进行检查。所以接口中仅需要实现check空白的方法。
    —第三个子类继承第二个子类并实现最后一个接口增加非周期的行为,这个接口只需增加对每个时间段的标记。该子类具有了处理三种行为的能力。这个子类就是最终想要的。对应一个时间段的情形,增加一个以标签为键值的哈希表即可实现。
    但是很明显,这种方式会形成一颗庞大的继承二叉树。从最初实现Intervalset接口的Commonset开始,考虑要实现所有的功能:
    在这里插入图片描述
    这还只是考虑了两个维度的情况,如果推广到多维的话显然就组合爆炸了。于是这就引出了另一种实现方式--------委托。委托的知识在学习笔记中有提到。

  • 通过委托的机制进行实现:
    ----每个维度一个接口,附带一个实现类。
    ----通过接口的组合(实际上是一个接口继承另外多个接口,java接口支持多继承),重新定义新的组合接口,这些组合接口供应用类进行使用。应用类实现对应的组合接口即可。
    —在应用类实现最终组合接口的过程中,需要Override所有组成最终组合接口的所有接口,这可以委托给这些接口已有的实现进行实现。
    ----在遇到特定应用类时,通过组合接口的方式定义一个针对于这个应用类的接口。应用类实现这个接口。对于上层接口的实现通过委托机制来完成。
    例如,对于如图所示的三个维度的接口:
    在这里插入图片描述

  • 每个接口首先定义一个实现类

  • 通过接口的组合形成了应用的接口
    在这里插入图片描述
    -最后,应用类实现这个接口即可。
    在这里,应用类dutyset将检测无重叠,非空,非周期的功能委托给三个具体的对象进行实现,并实现自己的接口。这相对于方案4而言是更加灵活的,不受父类的限制。例如,在上一个方案中,如果再有一个特征维度“周期,非周期”,对于上一个方案而言,要实现第三层结点的行为,必须至少先实现前两层的行为,再通过继承一个第二层的结点实现。而委托机制不然,只需要根据应用的功能组合一个接口,让应用实现这个接口即可,为了实现前面接口的行为可以很好的通过委托机制来实现。不必实现中间结点。同时,即使代码有变化,也会通过委托的对象一起变化。因此具有很好的可复用性和可维护性。

  • decorator装饰器模式难度较大,在后续的博客中再更新理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值