我们的5.3节讲了java设计模式,在课上我其实听得很懵,因此课后下来看课件查资料,将这一小节理了一下,让自己对这一节有更清晰的理解。

 

Adapter(适配器):

一句话描述适配器模式的感觉: src->Adapter->dst,即src以某种形式(三种形式分别对应三种适配器模式)给到Adapter里,最终转化成了dst。


类适配器模式Adapter类,通过继承 src类,实现 dst 类接口实现和继承同时完成,完成src->dst的适配。

Eg:public class Adapter extends src implements dst

因为这要求dst必须是接口,有一定局限性;
src类的方法在Adapter中都会暴露出来,也增加了使用的成本。

但同样由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。

 

 

对象的适配器模式只是将Adapter类作修改,这次不继承src类,而是持有src类的实例,以解决兼容性的问题。
即:持有 src类,实现 dst 类接口,完成src->dst的适配。

Eg:public class Adapter implements dst {

private src s;

......

}

 

接口的适配器模式当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。这部分其实我没怎么看懂)

 

 

 

Decorator(装饰器):

允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的

即:原始类作为参数传入装饰类(多个)中(装饰类的父类和原始类一样为同一个接口的实现,即说明:装饰类同样需要实现接口中的内容,但是装饰类是通过委派给装饰类中的原始类变量来实现装饰方法和接口中的方法)

 

 

 

(这里要搞清,装饰者是对src的装饰,使用者毫无察觉到src已经被装饰了(使用者用法不变)。 这里对象适配以后,使用者的用法还是变的。

 

 

Facade(外观模式):

外观模式提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。

 

 

Facade :系统对外的统一接口,客户端连接子系统功能的入口。

SubSystem:可以同时有一个或者多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已

SystemASystemBSystemC为三个同级的类,Facade中的operationAoperationBoperationC可以同时对他们三个进行委派调用,从而实现不同的功能。

 

 

Strategy(策略模式):

定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。

 

我的理解就是通过实现算法接口,实现多个算法类,然后在使用的类中,将接口作为变量类型,在不同的情况下通过给这个变量附上不同的实现类,从而实现不容的算法。

 

 

 

Template(模板模式):

 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。

  通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。

 

 

 

AbstractClass:实现了模板方法,定义了算法的骨架。

ConcreteClass:实现抽象类中的抽象方法,即不同的对象的具体实现细节。

 

我觉得这个模式就是现在我们最常用的模式,在lab3中我们对不同的点、边、图都是使用了这个模式。

 

Iterator(迭代模式)

Iterable接口保证实现该接口的对象是可迭代遍历的(必须要有Iterator  iterator()方法)

 

 

Iterator接口的实现,使实现类可以使用显式或隐式的迭代类。

 

 

让自己的集合类实现Iterable接口,并在实现自己独特的Iterator

Eg