在我们软件开发的过程中往往会遇到需求的变更,导致我们的功能需要的改变,进而可能让我们辛辛苦苦编写的大量代码付诸东流。那么,该怎样提高我们代码的可扩展性呢。提高我们代码的扩展性这样在改变功能的时候就能在最小代价的情况修改我们的代码。设计模式,就很大程度上为我们解决了这个问题。设计模式是一套理论,由前任总结出的一套可以反复使用的经验,他可以提高代码的可重用性,增强系统的可维护性,以及解决一系列的复杂问题。设计模式给我们提供指导,以六大设计原则为理论基础,23种具体的设计模式供我们实践参考。
1.工厂方法模式:主要角色有抽象产品,具体产品,抽象工厂,具体工厂 。它利用了多肽的特性,通过一个父类定义一个生产产品的公共的接口,而子类就实现生成具体产品,这样能使产品对象的实例化操作在子类中中完成,这样是通过具体的子类对象来确定实例化哪一个具体的产品类。能减少很多相同的代码量。
2.抽象工厂模式:主要角色有抽象产品,具体产品,抽象工厂,具体工厂 。可以说是对工厂方法模式的一个补充,工厂方法只能是一个产品或者一个方法,抽象工厂讲述的是对于该类型多个产品或对于一个对象的多个方法的整合,即在一个接口定义很多的方法,实现也实现很多方法。子类可以在一个父类中调用很多的方法。
3.建造者模式:主要角色有抽象建造者,具体建造者,指挥者,产品角色。一个对象往往是由很多部分组成的,我们需要通过一些方法就所有的部门封装成一个完整的对象,然后再返回给需调用者,调用者只用调用就行而无需关心该对象是怎么组装的。
4.原型模式: 主要角色有抽象原型类,具体原型类,客户类。当很多对象拥有相同的属性的时候,可以通过一个已有的实例来简化对象的创建过程,以此来提高新实例的创建效率。
5. 单例模式:主要角色有单例。单例,就是我们运行的当前虚拟机中有且只有一个需要的对象,不存在重复。单例模式在内存中只有一个实例,减少了内存开支, 减少了系统的性能开销。在开发中应用往往会用一中叫枚举方式实现单例,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
6.适配器模式:主要有目标抽象类,适配器类,适配者类,客户类。首先定义包装类,其作用是包装一些不兼容的接口的对象,在客户需要调用接口时,它会将客户的请求转化为对适配者相对应的接口。它主要实现一些接口不兼容的类一起工作。
7.桥接模式:主要角色有抽象类,扩充抽象类,实现类接口,具体实现类。对于有多个变化维度,并且每个维度都要多个变量,那么可以通过对每个维度分别定义一个接口,在与实现分离。降低它们的耦合度,是它们各自独立的变化。
8.组合模式:主要角色有抽象构件,叶子构件,容器构件,客户类。处理整体和部分之间的额关系,它通过将对象组织到树形结构中,很好的实现容器对象与叶子对象的递归组合,这样用户在使用的时候便不用区分它们而是均看做是容器对象和叶子对象。
9.装饰模式:主要角色有抽象构件,具体构件,抽象装饰类,具体装饰类。在不必改变原类文件和不使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。虽然使用继承也能实现对一个类的功能进行增强,但是在继承时会出现子类爆炸的问题。
10.外观模式:主要角色有外观角色,子系统角色。一个大型的系统往往是由很多小系统组成的,这些子系统与外界的交互是一个统一的外观对象。通过定义一个高层的接口来使子系统的一组接口有一个一致的界面。
11.享元模式:主要角色有抽象享元类,具体享元类,费共享具体享元类,享元工厂类。在系统中多个对象中的属性有相同的那么 它们可以利用享元工厂负责一个享元池。是外部的对象可以共享这里面的功能和属性。
12.代理模式:主要角色有抽象主题角色,代理主题角色,真实主题角色。通过引入一个新的对象来做一些真实对象没做的事儿。在spring中就运用了典型的动态代理来进行对事务的管理。其中包含有jdk动态代理和cglib动态代理,它们通过在内存中产生一个新的类来作为真实类的替身,并且帮它们完成事务的提交和关闭等一些列操作。这样在写真实对象的时候就不需要写过多的代码,只需要就此拿给spring代理就行了。
13.职责链模式:主要角色有抽象处理着,具体处理者,客户类。对一个客户的请求通过用户不同的功能的类就行逐级的接受。知道这个请求能被处理为止。
14.命令模式:主要角色有抽象命令类,具体命令类,调用者,接受者,客户类。在一些对象发送请求的时候就需要有接受者来接受这个请求。我们通过命令请求者发送它的请求而不管请求在传递的过程中被谁接受,然后只需要命令接受者接受这个请求就可以,而不用管是谁发出来的请求。这样就类似于我们在软件开发过程中在持久层中定义与数据库交互的方法,只需要定义一个泛型使每一个传过来的额请求都能与数据库进行交互而不用管发出命令的是谁。
15.解释器模式:主要角色有抽象表达式,终结符表达式,非终结符表达式,环境类,客户类。就是通过一个解释代码字符的程序来完成用户所想要达到的效果。
16.迭代器模式:主要角色有抽象迭代器,具体迭代器,抽象聚合类,具体聚合类。对于一个list对象或者一个set对象,定义一个迭代器来对这些对象进行访问和遍历。
17.中介者模式:主要角色有抽象中介者,具体中介者,抽象同事类,具体同事类。利用一个中介场所,该场所包含了一系列的对象交互,使用户均能在这个中介场所中进行用户之间的交互,并且独立互补影响。
18.备忘录模式:主要角色有原发器,备忘录,负责人。对于一个对象,我们在不破坏其封装性的前提下获取它的内部状态,并且能保存该对象的状态。之后在对这个对象操作之后我们能返回到之前对象保存时候的状态。就是等同于撤销操作。
19.观察者模式:主要角色有目标,具体目标,观察者,具体观察者。多个有关联的对象,在某一个对象的状态发生改变时,其他与之相关联的对象会自动做出一些因为那个对象状态改变所影响到的行为。
20.状态模式:主要角色有环境类,抽象状态类,具体状态类。把执行的动作封装在跟状态有关的类里,由状态来决定动作该如何执行。等于就是给一个对象赋予哪些权限,当该对象的权限发生改变时,那么他的行为也将会随之改变。
21.策略模式:主要角色有环境类,抽象策略类,具体策略类。用户在想要达到一个目的时候可以用不同的方法。每一个方法里都有不同的执行过程。虽然目的相同但是在执行不同的过程中所达到的效果是不一样。
22.模板方法模式:主要角色有抽象类,具体子类。在用户实现某些功能的时候所经历的步骤是一样的,那么就可以在抽象类中把基本操作方法组合在一起形成一个总算法或一个总行为的方法。就比如在连接数据库的时候都是一套的流程,那就可以使用末班方法提高效率。
23.访问者模式:主要角色有抽象访问者,具体访问者,抽象元素,具体元素,对象结构。对于一个对象,可以有不同的对象(访问者)来对这个对象进行访问,但是呢由于访问者不同,它们访问的方式就有可能不同,从而使它们所访问到的东西就不相同。而且还可以新增一个访问者来对那一个对象就行访问。