什么是设计模式呢?这个问题曾经一直困扰着我,以前我一直以为这是门新的技术,但是随着工作年限和工作经验的增加,其实设计模式就是已经在众多软件系统得到验证的成功的并且可复用的技术方案或者解决问题的方案。Java是目前最主流的开发语言之一,在众多的实践中,总结出了多个设计模式,学习这个模式有助于程序员写出高质量的而又有效的代码。因此一种设计模式能够解决类似的问题,并加以复用。但是在实际的编程中可能在解决一个问题时组合使用多个设计模式,这就要我们要活学活用了。
对于Java的设计模式来说,目前流行的主要有23种,这些设计模式解决了Java程序开发中的大多数的设计问题。在这先说说代码编程中的一些原则,也就是设计模式的初衷吧。
1.面向抽象原则
指当设计一个类 时,不让该类面向具体的类,而是面向抽象类或者接口类,即所设计类中的重要数据是抽象类或者接口声明的变量,而不是具体声明的变量。我的理解是Java里的多态,就是一个模块中各个功能点都会用到方法的高度抽象和提取,是普遍具有的行为动作。往往找这个抽象类比较难,需要不断思考,然后抽丝剥茧。
2.开 - 闭原则
就是让设计对扩展开放,对修改关闭。怎么理解这句话呢?其实是指当一个设计中增加新的模块时,不需要修改现有的模块。在给出一个设计时,要充分考虑客户需求的变化,将客户变化的部分设计为对外扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分要对修改关闭。也就是说不能因为用户的需求变化了,核心的基本结构代码做修改。遵守开 - 闭原则的设计肯定是易于维护的,因为在设计中增加新的模块是,不用修改设计中的核心模块。
这里不是说系统的每个部分都要遵守这个原则,而是在把主要精力集中在应对设计中最有可能因为需求变化而需要改变的地方,然后想办法应有这个原则加以解决。
当设计一个系统时,经常需要面向对象来考虑系统的总体设计,不要考虑具体类,这样就容易设计出满足 开 - 闭 原则的系统,在程序设计好以后,首先对abstract类的修改关闭,否则,一旦修改abstract类,比如,增加一个abstract方法,那么所有的子类都要进行修改;应当增加abstract类的子类开发,即在程序中再增加子类时,不需要修改其他面向抽象类而设计的重要类。
3.多用组合少用继承原则
(1)继承和复用
子类继承父类的方法可以作为自己的方法,实现了代码的复用,并且可以重写父类的方法,用于扩展。
但是子类和父类是强耦合的关系,也就是说父类修改时势必会影响子类,并且父类的内部结构,子类也是一清二楚。
(2)组合与复用
一个类可以把对象作为自己的成员变量,那么这个类就是其他类的组合了,那么其他对象就可以调用该对象的方法了。
当前对象包含的对象中方法的具体实现对当前对象是不可见的;
组合关系是弱耦合关系,修改当前对象所包含的对象中代码不用修改当前对象代码;
当前对象可以在运行是动态指定所包含的具体对象,例如成员变量是个接口,运行时可以动态指定实现类;
这个缺点就是可能会导致系统中的对象过多,为了组合多个对象必须得仔细对接口进行定义。
(3)多用组合,少用继承
这样做的目的就是为了写出低耦合的代码。
4.高内聚 - 低耦合原则
如果类中的方法是一组相关的行为,则称该类是高内聚,反之称为低内聚。高内聚便于类的维护,低内聚不利于维护。
低耦合就是尽量不要让一个类含有太多其他类的实例引用,避免修改系统其中一部分会影响其他部分。