【java基础】——初识java中的设计模式

来源:互联网 发布:淘宝搜索引擎怎么做 编辑:程序博客网 时间:2024/06/14 22:07

一、面向对象思想设计原则

在实际的开发中,我们想要更深入的了解面向对象的思想,就必须熟悉前人总结过的面向对象的思想的设计原则。

1、单一职责原则

单一职责原则其实也就是开发人员经常说的“高内聚、低耦合”。也就是说,每一个类应该只有一个职责,对外只能提供一种功能,而引起该类变化的原因应该只有一个。在设计模式中,所有的设计模式都遵循这一原则。

2、开闭原则

①核心思想:一个对象对扩展开方,对修改关闭。
②开闭原则的意思是,对类的改动是通过增加代码进行的,而不是修改现有代码。也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直运行下去,如何能够做到这一点呢?这就需要借助于抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现则是可以改变和扩展的。

3、里氏替换原则

①核心思想:在任何父类出现的地方都可以用它的子类来替代。
②换而言之,同一继承体系中的对象都应该有共同的行为特征。

4、依赖注入原则

①核心思想:要依赖于抽象,不要依赖于具体实现。
②其实就是说,在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类。为了实现这一原则,就要求我们在编程的时候针对抽象类或者接口编程,而不是针对具体实现编程。

5、接口分离原则

①核心思想:不应该强迫程序依赖它们不需要使用的方法。
②其实就是说,一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。

6、迪米特原则

①核心思想:一个对象应当对其他对象尽可能少的了解。
②其实就是说:降低各个对象之间的耦合,提高系统的可维护性。在模块之间应该只通过接口编程,而不理会模块的内部工作原理,它可以使各个模块耦合度降到最低,促进软件的复用。

二、设计模式概述

1、设计模式的概念

①设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
②设计模式不是一种方法和技术,而是一种思想。
③设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,是设计的程序可复用。
④学习设计模式能够促进对面向对象思想的理解,反之亦然。它们相辅相成。

2、设计模式的几个要素

  • 名字 必须有一个简单,有意义的名字
  • 问题 描述在何时使用模式
  • 解决方案 描述设计的组成部分以及如何解决问题
  • 效果 描述模式的效果以及优缺点

3、设计模式的分类

设计模式目前有23种,分为3大类型。
①创建型模式——对象的创建:简单工厂模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,单例模式。(6个)
②结构型模式——外观模式、适配器模式、代理模式、装饰模式、桥接模式、组合模式、享元模式。(7个)
③行为型模式——模版方法模式、观察者模式、状态模式、职责链模式、命令模式、访问者模式、策略模式、备忘录模式、迭代器模式、解释器模式。(10个)
本文讲对其中的几种模式做一个简单介绍。

三、单例设计模式

1、什么是单例设计模式

单例设计模式就是要确保在内存中只有一个对象,该实例必须自动创建,并且对外提供。

2、单例设计模式的优缺点

  • 优点:在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
  • 缺点:没有抽象层,因此扩展很难。职责过重,在一定程序上违背了单一职责。

3、单例设计模式的原则

单例设计模式的原则就是要保证一个类在内存中只有一个对象,要确保对象唯一,我们可以这么来做:
①为了避免其它程序过多建立该类对象,需要先禁止其它程序建立对象。
②为了保证其它程序可以访问该类对象,需在本类中先定义一个对象。
③为了方便其它程序对自定义对象的访问,可以对外提供一些访问方式。

4、单例设计模式的实现步骤

①因为创建对象都需要构造函数初始化,只要将本类的构造函数私有化,其它程序就无法再创建该类对象。
②就在类中创建一个本类的对象。
③定义一个方法,返回该对象,让其它程序可以通过方法就得到本类对象。

5、单例设计模式之饿汉式

饿汉式就是一进内存就创建对象。
代码示例如下:

/*单例模式之懒汉式*/class single{//构造函数初始化private single(){}//在本类中创建一个本类对象private static single s = new single();//提供一个公共的获取本类对象的方法public static single getInstance(){return s ;}}public class SingleDemo{public static void main(String[] args){//通过类名.方法的方式获取对象。single ss = single.getInstance();}}

6、单例设计模式之懒汉式

懒汉式是类的对象延迟加载。
代码示例如下:

/*单例设计模式之懒汉式*/class Single{private String name = "黄祥";public static Single s = new Single();private Single(){}public String getName(){return name;}public void setName(String name){this.name = name;}/* public static Single getInstance(){return s;} *//*为了防止多线程同时进入getInstance方法,导致多个对象的存在。加入同步锁。*/public static Single getInstance(){if(s == null){synchronized(Single.class){if(s == null){s = new Single();}}}return s;}}public class SingleDemo2{public static void main(String[] args){Single s1 = Single.getInstance();System.out.println(s1.getName());Single s2 = Single.getInstance();}}

四、装饰设计模式

1、什么是装饰设计模式

装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案。

2、装饰模式的优缺点

  • 优点:使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能。
  • 缺点:正因为可以随意组合,所以就可能出现一些不合理的逻辑。
3、当我们需要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能进行增强。那么可以称这个自定义的类为装饰类。下面通过一个代码小例子引入:
class Person{public void eat(){System.out.println("吃饭");}}public class PersonDemo{public static void main(String[] args){Person p = new Person();p.eat();SuperPerson  sp = new SuperPerson(p);sp.superEat();}}//当我们需要对上面的吃饭功能进行增强时class SuperPerson{private Person p ;SuperPerson(Person p){this.p = p;}public void superEat(){System.out.println("饭前来杯开胃酒");p.eat();System.out.println("吃完饭再吃点甜点");System.out.println("饭后一根烟");}}
其实呢装饰模式就是通过构造函数传递进行功能增强,但是使用继承可以达到同样的目的,但相比之下就会发现真正构建出来的体系会非常臃肿。
如:假设有一个专门用于读操作的类MyReader,然后它会有一些列的子类:
|----MyTextReader
      |----MyBufferTextReader
|----MyMediaReader
      |----MyBufferMediaReader
…………………………
一直下去,整个体系就回变得非常臃肿。如进行一次装饰,那么体系结构就会变得清晰灵活得多。

五、模板设计模式

1、什么是模板设计模式

模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现。

2、模板设计模式的优缺点

  • 优点:使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求。
  • 缺点:如果算法骨架有修改的话,则需要修改抽象类。
3、在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。由该类的子类去完成。
代码演示如下所示:

//例子:模板方法设计模式,获得代码的运行时间abstract class GetTime {    public final void getTime()    {        long start = System.currentTimeMills();        runcode();        long end = System.currentTimeMills();        System.out.println("毫秒:"+(end-start));    }    public abstract void runcode();}class Test extends GetTime{    public void runcode()    {        ....    }}

六、工厂方法模式

1、什么是工厂方法模式

工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。

2、工厂方法模式的优缺点

  • 优点:客户端不需要在负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性。
  • 缺点:需要额外的编写代码,增加了工作量。

1 0