java部分设计模式

/*
单例设计模式
 思想:
  1.不让其他程序创建该类对象。
  2.在本类中创建一个本类对象。
  3.对外提供方法,让其他程序获取这个对象。
代码体现:
  1.私有化构造方法,目的是让其他程序无法创建该类对象。
  2.创建私有并静态的本类方法。
  3.定义共有并静态的方法,返回该类对象。
解决的问题:保证一个类在内存中的对象唯一性。
*/
class Single { //单例设计模式:饿汉式
    private Single(){}
    private static Single s=new Single();
    public static Single getInstance(){
        return s;
    }    
}  
class Single2 {// 单例设计模式:懒汉式,延迟加载方法
    private Single2(){}
    private static Single2 s2=null;
    public static Single2 getInstance(){
        if(s2==null)
            s2=new Single2();
        return s2;
    }
}
/*
模板方法设计模式
解决的问题:当功能内部一部分实现确实,一部分实现不确定。这时可以把不确定的部分暴露出去,让子类去实现。
*/
abstract class GetTime{
    public final void getTime(){
        long start = System.currentTimeMillis();
        code();//将不确定的部分,提取出来,通过抽象方法实现。
        long end = System.currentTimeMillis();
        System.out.println("毫秒是"+(end-start));
    }
    public abstract void code();//抽象不确定的功能,让子类复写实现。
}
class SubDemo extends GetTime{
    public void code(){//子类复写功能方法
        for(int i=0;i<1000;i++){
            System.out.println(i);
        }
    }
}
/*
 装饰设计模式
解决的问题:对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。
特点:装饰类和被装饰类都必须所属于同一个接口或者父类。
例 1:
class Person{
   public void Eat(){
      System.out.println("吃饭");
   }
}
class NewPerson{
    private Person p;
    public void Eat(Person p){
       System.out.println("开胃酒");
       p.Eat();
       System.out.println("甜点");
    }
}

装饰和继承都能实现一样的特点: 进行功能的拓展增强。
有什么区别呢?
例 2:首先有一个继承体系:
Writer
     |--TextWriter:用于操作文本
     |--MediaWriter:用于操作媒体
想要对操作的动作进行效率的提高。
按照面向对象,可以通过继承对具体的进行功能的扩展。
效率提高需要加入缓冲技术。
Writer
     |--TextWriter:用于操作文本
        |--BufferTextWriter:加入缓冲技术的操作文本对象。
     |--MediaWriter:用于操作媒体
        |--BufferMediaWriter:加入缓冲技术的操作媒体对象。
到这里就可以了,但是这样做好像并不理想。
如果这个体系进行功能拓展,又多了流对象。
那么这个流要提高效率,是不是也要产生子类呢?
是,这是就会发现只为提高功能,进行的继承,导致继承体系越来越臃肿。不够灵活。
重新思考问题? 既然加入的都是同一种技术--缓冲 前一种是让缓冲和具体的对象相结合。 可不可以将缓冲进行单独的封装。那个对象需要缓冲就将那个对象和缓冲关联。 class Buffer extends Writer{ BufferWriter(Writer w){} } Writer |--TextWriter:用于操作文本 |--MediaWriter:用于操作媒体 |--BufferWriter:用于提高效率 装饰要比继承灵活。
*/ class Person{ public void Eat(){ System.out.println("吃饭"); } } class NewPerson{ private Person p; public void Eat(Person p){ System.out.println("开胃酒"); p.Eat(); System.out.println("甜点"); } }

猜你喜欢

转载自www.cnblogs.com/zhanqiangqiang/p/9978526.html