由于基于ADT和oop的程序设计为了更好的性能和可读性,有几种设计模式可供使用。
设计模式分为以下三种:
创建型模式,结构型模式以及行为类模式。
创建型模式
factory method
情况:用户端不知道创建哪个具体类或者不想在客户端代码中指明具体创建实例。
方法:创建一个factory接口来存放所有的new的方法,以不同的具体类来实现这个接口,接口中写一个没有完成的方法创建对象。返回一个想要隐藏的新创建对象。在客户端代码中以factory接口的具体类创建对象调用函数返回一个新的类。
结构型模式
adapter 适配器模式 delegation
情况:当前有一个类,想要给它新的方法和这个类不匹配
方法:由于ocp不能随意改变代码,所以新建一个接口,然后创建一个类,其中有一个同名方法用于将要做的事情delegate给原来当前已经实现了的类,在客户端代码中新建一个接口实现类调用同名方法,将真正的实现代码隐藏了起来。
decorator 装饰器模式 delegation+inherience
情况:需要一个很多性能叠加的类
方法:创建一个decorator的interface,将里面所有实现的功能delegate给没有叠加任何属性的类实现可以实现的所有方法。然后建立各种各样带有不同属性的接口实现类,其中每一个这样的类创建函数都是输入一个接口定义的对象,以及想要新加进去的属性(可以没有),在其中实现新的需要实现的方法或者功能。最后就能得到一个具有很多属性的被层层装饰的类。
行为类模式:
Strategy 策略模式 delegation
情况:有许多不同的算法来实现同一种情况
方法:构造一个抽象接口,再用多个类作为实现接口的实现类。构造一个类专门用来调用方法,这个类就是将要实现的操作以接口方式定义的对象调用需要实现的方法。其中构建的输入时从客户端输入的实现接口的具体类。然后在客户端代码中构建一个具体类的对象传入专门用来实现操作的类,这个类将会将操作delegate给接口的一个具体类,最后返回结果。
template 模板模式
情况:做一件事情的步骤一致,但具体方法不同。
方法:定义一个抽象类,将操作不同的方法定义为抽象类型等待子类完成,将同样的方法比如步骤定义为final类型不可变,子类无条件继承。将实现不同的方法定义成不同类中的方法来实现接口,最终实现多个方法可以完成的效果。
Iterator 迭代器
情况:实现一个集合类的遍历
方法:自己创建一个具体的实现类去实现Iterable接口,然后在里面实现自己独特的Iterator类,实现三个基本方法:hasNext,next,remove,可以用来实现集合类的迭代。
Visitor
情况:对特定类型object的特殊操作visit,将数据与操作分离开,为ADT预留下一个可以扩展功能的扩展点。在不改变自身情况下实现特殊功能。
方法:创建一个visitor的接口,在里面写上visit的方法。然后创建一个具体的visitor的实现类,将visit方法的参数定为需要访问的类,在其中实现需要访问完返回的东西。在需要访问的类中加上accpt函数,参数就是visitor,实现的方法是visitor.visit(this)。在客户端程序中,建立一个visior的对象,然后传入需要访问对象的accept函数中。其实相当于将相关的操作delegate出去了。
visitor和strategy的区别:
visitor是站在外部客户端角度,灵活增加对ADT的各种操作。而stategy是站在内部的ADT角度,改变了内部功能的配置。