本篇文章用来写学习中遇到的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:用于提高效率。
装饰比继承更为灵活, 但是需要 装饰类和被装饰类都必须所属同一个接口或父类。未完待续