java的中的设计模式

本篇文章用来写学习中遇到的java设计模式

1.  模板方法设计模式

    在定义功能时,功能的一部分是确定的,但有一部分是不确定的,而确定的部分在使用不确定的部分,此时就将不确定的部分暴露出去,由该类的子类去完成。也就是说为了避免子类的重复代码,我们将那些可能实现不同的细节暴露出去,由子类进行重写。

 例如: 需求是  获取一个程序运行的时间 。 

 分析: 我们可以获取程序开始和结束的时间,相减即可。

package test;

abstract class GetTime{
	public final void getTime(){
		long start = System.currentTimeMillis();
		//具体的功能由子类实现
		runcode();
		
		long end = System.currentTimeMillis();
		System.out.println("毫秒:"+(end-start));
	}
	
	public abstract void runcode();
}
// 实现具体的功能
class SubTime extends GetTime{
	public  void runcode(){
	   for(int x=0; x<4000; x++){}
	}
}

public class  TemplateDemo{
	public static void main(String[] args) {
		SubTime gt = new SubTime();
		gt.getTime();
	}
}

总结: 即提取出公用的代码,而将那些可变的行为交由子类去实现。

2.  单例模式

保证一个类只有一个实例,设计一个公共的方法,返回该实例。

常见的单例实现模式有 饿汉式,懒汉式。

饿汉式举例如下

package test;
/**
 * 单例模式之----饿汉式,
 *  在类加载时就进行了初始化。
 *
 */
public class SingleDemo {
  private static final SingleDemo singleDemo =new SingleDemo();
  
  private SingleDemo() {}

  public static SingleDemo getInstance(){
	  return singleDemo ;
  }
}

懒汉式举例如下:

package test;
/**
 * 懒汉式
 * 	类加载时并没有初始化。延迟加载
 */
public class SingleDemo2 {
	// 将构造方法私有化,禁止通过new进行创建
  private SingleDemo2() {}
  
  private static SingleDemo2 singledemo2 = null;
  // 使用的时候才开始初始化该对象
  public static synchronized SingleDemo2 getInstance(){
	  if(singledemo2 ==null)
		  singledemo2=new SingleDemo2() ;
	  return singledemo2 ;
  }
}

3. 装饰设计模式

   当对一组对象自的功能进行增强时,就可以使用该模式进行问题的解决。   

 和继承一样,都能进行功能的扩展。

 假如有一个继承体系:

    Writer

         1-- TextWriter : 用于操作文本

         1 -- MediaWriter : 用于操作媒体

 如果想加入缓冲技术来提高效率,那么理论上我们可以通过继承来进行具体的功能的扩展。于是现有体系就变成:

    Writer

        1 -- TextWriter 

            1-- BufferedTextWriter :加入了缓冲技术的操作文本对象。

        1 -- MediaWriter

            1 -- BufferedMediaWriter :加入了缓冲技术的操作媒体对象。

慢慢的,以后随着功能的扩展,就会发现只为提高功能,而进行的继承,导致继承体系越来越臃肿,不够灵活。

  重新思考下:

    既然加入的是同一种技术,可不可以将缓冲技术进行单独的封装,哪个对象需要缓冲,就将哪个对象和缓冲关联。

   eg:

class BufferWriter{
	BufferWriter(Writer w)
	{
		直接对父类进行操作后,子类也跟着变化了 。
	}
}

  于是,现在继承体系就变为:

     Writer

  1--TextWriter :用于操作文本。

  1--MediaWriter:用于操作媒体。

  1--BufferWriter:用于提高效率。

   装饰比继承更为灵活, 但是需要  装饰类和被装饰类都必须所属同一个接口或父类。

未完待续    

猜你喜欢

转载自blog.csdn.net/m0_37564404/article/details/80157615