技术文章
当前位置:首页 > Java技术文章 > java中设计模式(装饰设计模式)的实例详解

java中设计模式实例分享

  • 发布时间:
  • 作者:码农之家原创
  • 点击:160

这篇文章主要知识点是关于java、设计模式、全面解析Java设计模式之单例模式 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下java相关的电子书

你不知道的JavaScript(中卷)
  • 类型:JS大小:7.8 MB格式:PDF出版:人民邮电出版社作者:辛普森
立即下载

更多Java相关的学习资源可以参阅 Java电子书程序设计电子书 等栏目。

java中设计模式(装饰设计模式)的实例详解

java 中设计模式(装饰设计模式)的实例详解

应用场景

在不对原有对象类进行修改的基础上,给一个或多个已有的类对象提供增强额外的功能.

我觉得可以从字面理解,装饰,装饰房子。房子可以看成原有的类。等于你把一个已经建好的房子按照自己的想法再装饰一遍。继承也可以实现这样的功能,但是继承有它的缺点,继承只是单一继承。装饰设计模式可以取多个不同的类的不同功能。

具体步骤:

◎第1步:通过构造传参把需要加强的类传过来。(你要装修房子,肯定的先有房子吧。这个很好理解)

◎第2步:把具体需要增强的功能写了

具体例子及代码

写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:

(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;

(2)提供一个能够每次读取一行字符的myReadLine()方法。

import java.io.FileReader;
import java.io.IOException;
/**
 * * 版本2: 增强FileReader类,使它具有如下功能:
 * (1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
  (2)提供一个能够每次读取一行字符的myReadLine()方法。
 */
public class MyBufferedReader {
  private char[] cbuf= new char[1024];//缓存
  private int pos=0; //当前读取的位置
  private int count=0;//记录缓存中当前的字符总数

  //封装一个FileReader对象,帮助我们实现从文件中读取一批数据
  private FileReader r = null;

  public MyBufferedReader(FileReader r) {
    super();
    this.r = r;
  }


  /**
   * 从缓存中读取一个字符数据返回
   * @throws IOException 
   * @return所读取的字符,如果到达文件末尾则返回-1
   */
  public int myRead() throws IOException{
    //从文件中把数据读取到缓存buf[]中
    if(count<=0){
      //System.out.println("**********");
      count = r.read(cbuf);
      if(count==-1){
        return -1;
      }
      pos=0;
    }

    char ch = cbuf[pos];
    pos++;
    count--;
    return ch;
  }


  //回车字符: \r 13
  //换行字符: \n 10

  public String myReadLine() throws IOException{
    StringBuilder sb=new StringBuilder();
    int ch=0;
    //有回车换行符部分
    while( (ch=myRead())!=-1){ 
      if(ch=='\r'){
        continue;
      }
      if(ch=='\n'){
        return sb.toString();
      }
      sb.append((char)ch);
    }

    if(sb.length()!=0){//最后一行(没有回车换行符)
      return sb.toString();
    }

    return null;//最后或空文件
  }


  public void close() throws IOException{
    r.close();
  }
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

全面解析Java设计模式之单例模式

本文实例为大家分享了Java设计模式之单例模式的具体代码,供大家参考,具体内容如下

概念:

单例模式:一个类中只有一个实例。

一个类有且仅有一个实例,并且提供了一个全局的访问点。

使用该模式的起因:

  当我们在浏览网站时,有些网站会显示“当前在线人数”。通常,实现这个功能的办法是将登陆的每一个IP存储在一个内存、文件或者数据库中,每多一个IP,就实现“+1”。一般就是用一个方法,比如add(),实现“+1”的功能,比如用“update”语句,先获取数据库中存储的数据,再+1,更新数据库中的数据,,然后保存;显示在页面时,再通过另外的方法获取数据库中的数据即可。但是,当多个用户同时登陆时,如果每一个都要new一个对象,然后再通过“对象.方法名”调用执行add()方法,再将数据存储到数据库中,这样就会导致多个用户无法将实际的用户数据准确的记录到数据库中。所以,把这个计数器设计为一个全局对象(所有人都使用这一个对象,而不是用一个,new一个),所有人都共用同一份数据,就可以避免类似的问题,这就是我们所说的单例模式的其中的一种应用。 

同样的,还有其他场景中,也会遇到相似的情景,使用到类似的思路。比如:

   1.外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件
   2. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
   3. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
   4. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
   5. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
   6. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
   7. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
   8. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
   9. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
   10. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例。 

总结起来,单例模式的一般应用场景为:

    1.需要频繁实例化然后销毁的对象。

    2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

      3.有状态的工具类对象。

    4.频繁访问数据库或者文件的对象。

    5.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件、应用配置等。

    6.控制资源的情况下,方便资源之间的互相通信。如线程池等。

特点:

1、单例类只能有一个实例;

2、单例类必须自己创建自己的唯一实例;

3、单例类必须给所有其他对象提供这一实例

单例模式要素: 

   1.私有构造方法
   2.私有静态引用指向自己实例
   3.以自己实例为返回值的公有静态方法 

实现单例模式的三种方法:

1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)

/**
* 饿汉式(推荐)
*
*/
public class Test {
    private Test() {
    }
    public static Test instance = new Test();
    public Test getInstance() {
        return instance;
    }
}

优点 

    1.线程安全
    2.在类加载的同时已经创建好一个静态对象,调用时反应速度快

缺点 

    资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
       //多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况
            instance = new Singleton2();
        }
        return instance;
    }
}

优点 

    避免了饿汉式的那种在没有用到的情况下创建事例,资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。

缺点 

    懒汉式在单个线程中没有问题,但多个线程同事访问的时候就可能同事创建多个实例,而且这多个实例不是同一个对象,虽然后面创建的实例会覆盖先创建的实例,但是还是会存在拿到不同对象的情况。解决这个问题的办法就是加锁synchonized,第一次加载时不够快,多线程使用不必要的同步开销大。

3.双重检测

class Test {
    private Test() {
    }
    public static Test instance = null;

    public static Test getInstance() {
        if (instance == null) {
            synchronized (Test.class) {
                if (instance == null) {
                    instance = new Test();
                }
            }
        }
        return instance;
    }
}

优点 

    资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法

缺点 

    第一次加载时反应不快,由于java内存模型一些原因偶尔失败

4.静态内部类

class Test {
    private Test() {
    }

    private static class SingletonHelp {
        static Test instance = new Test();
    }

    public static Test getInstance() {
        return SingletonHelp.instance;
    }
}

优点 

    资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法

缺点 

    第一次加载时反应不够快

总结: 

    一般采用饿汉式,若对资源十分在意可以采用静态内部类,不建议采用懒汉式及双重检测

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于Java的全部知识点内容总结,大家还可以在下方相关文章里找到Java SDK实现离线签名代码详、 java用jdbc连接数据库实例方、 Java中判断对象是否为空的、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Java获取时间差实例代码详解

下一篇:Java中通过Class类获取Class对象的实例方法

展开 +

收起 -

java设计模式 相关电子书
java设计模式 学习笔记
网友NO.678024

Java设计模式之单例模式实例详解【懒汉式与饿汉式】

本文实例讲述了Java设计模式之单例模式。分享给大家供大家参考,具体如下: 单例模式 就是产生一个对象实例,供外外部访问。 它的应用场景就是在这个类在全局真资源需要统一访问,否则会造成混乱时,才有必要设计成单例。 懒汉式 ,就是在使用这个对象时,才去查看这个对象是否创建,如果没创建就马上创建,如果已经创建,就返回这个实例。 饿汉式 ,在加载这个类的时候就先创建好一个对象实例,等待调用。 两者的优缺点也能猜到, 使用懒汉式,在反应速度上肯定要比饿汉式慢 。 但是这个对象如果不被调用,那就节省了cpu和内存资源。 模式很简单,下面给出实例。 package org.test.design.single;/** * 懒汉式,单例模式 * @author lushuaiyin * */public class Loon { public static Loon loon=null; public static Loon getInstance(){ if(loon==null){ loon=new Loon(); } return loon; }} pa……

网友NO.792906

Java设计模式之Adapter适配器模式

一、场景描述 “仪器数据采集器”包含采集数据以及发送数据给服务器两行为,则可定义“仪器数据采集器”接口,定义两方法“采集数据capture”和“发送数据sendData”。 “PDF文件数据采集器”实现时,要实现“仪器数据采集器”接口,实现“采集数据”方法;目前有“PDF文件内容解析工具”类PdfFileExtractor,该类实现PDF文件的数据解析;因此,可使“PDF文件数据采集器”继承“PDF文件内容解析工具”类,并实现“仪器数据采集器”接口,如下图所示: 适配器的作用是,继承现有的类,通过实现接口,扩展其用途。 类适配器继承源类,由于子类仅能继承一个父类,因此被继承的源类实现目标接口的方法多少也可以算做适配程度的高低。 二、示例代码 接口: package lims.designpatterndemo.adapterclassdemo;public interface EquipmentDataCapture { public String capture(String fi……

网友NO.993598

Adapter适配器模式在JavaScript设计模式编程中的运用分析

定义 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。速成包装器(wrapper)。 适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前的需求。这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模块很复杂,或者我们拿到的模块是一段别人编写的经过压缩的代码,修改原接口就显得不太现实了。第二种办法是创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道。 为什么需要采用适配器模式? 在开发应用程序时,您往往会需要更……

网友NO.875127

java 设计模式之State(状态模式)

java 设计模式之State(状态模式) 在状态模式中,一个类的行为基于它的状态的改变而改变。状态模式归属于行为型模式。 在下面的实例中,我们创建了一个接口State,定义了一个操作方法,两个实现类StartState和StopState。另外,创建了一个上下文类Context,这个类关联到State类。UML类图如下所示: //状态类 public interface State { public void doAction(Context context); } //实现类StartState.java public class StartState implements State { public void doAction(Context context) { System.out.println("Player is in start state"); context.setState(this); } public String toString(){ return "Start State"; } } //实现StopState.java public class StopState implements State { public void doAction(Context context) { System.out.println("Player is in stop state"); context.setState(this); } public String toString(){ return "Stop State"; } } //上下文Context.java 实际运用时可自行更改 public class ……

网友NO.127632

23种设计模式(21)java享元模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。 Java中的String类型 在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。String a="abc",其中"abc"就是一个字符串常量。 public class Test { public static void main(String[] args) { String a = "abc"; String b = "abc"; System.out.println(a==b); }} 上面的例子中结果为:true ,这就说明a和b两个引用都指向了常量池中的同一个字符串常量"abc"。这样的设计避免了在……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

电子书资源由网友、会员提供上传,本站记录提供者的基本信息及资源来路

鸣谢: “ 码小辫 ” 公众号提供回调API服务、“ 脚本CDN ”提供网站加速(本站寻求更多赞助支持)

版权投诉 / 书籍推广 / 赞助:520161757@qq.com

上传资源(网友、会员均可提供)

查看最新会员资料及资源信息