整理笔记--Java基础(设计模式)
程序员文章站
2022-04-22 08:49:30
装饰设计模式: 使用场景: 二次开发的时候,无法获取到源码,无法使用继承的前提下,希望对已经存在的对象上的功能进行增强,考虑使用。 好处:降低耦合性 实现: 弊端:如果接口中的方法过多,实现会比较繁琐。 动态代理(解决了装饰设计模式的弊端问题): 1.通过反射产生一个代理类。 2.只要传入一个对象, ......
装饰设计模式:
使用场景:
二次开发的时候,无法获取到源码,无法使用继承的前提下,希望对已经存在的对象上的功能进行增强,考虑使用。
好处:降低耦合性
实现:
1、包装类和被包装对象要实现同样的接口; 2、包装类要持有一个被包装对象; 3、包装类在实现接口时,大部分方法是靠调用被包装对象来实现的,对于需要修改的方法我们自己实现;
弊端:如果接口中的方法过多,实现会比较繁琐。
动态代理(解决了装饰设计模式的弊端问题):
1.通过反射产生一个代理类。
2.只要传入一个对象,就可以生成它的代理类。
弊端:这个对象必须要实现一个接口!
固定写法:用Proxy.newProxyInstance(这里有三个参数)方法。
//第一个参数 当前所在类的字节码加载器 //第二个 被包装类实现的所有接口 //第三个 实现invocationHandler匿名内部类
单例设计模式:
使用场景:
设计一个类,通过这个类只能获取到一个对象。
思想:
1.不让其他程序创建该类对象。 2.在本类中创建一个本类对象。 3.对外提供方法,让其他程序获取这个对象。
代码体现:
1,私有化构造函数; 2,创建私有并静态的本类对象; 3,定义公有并静态的方法,返回该对象。
例子1:
//饿汉式 class Single{ private Single(){} private static Single s=new Single(); public static Single getIntance(){ return s; }}
例子2:
//懒汉式 class Single{ private Single(){} private static Single s; public static Single getInstance(){ if(s==null){ synchronized(Single.class){ if(s == null) s=new Single(); reture s; }}}}
两者的区别:
1.饿汉式是空间换时间,懒汉式是时间换空间。 2.在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能会创建多个对象。
例子3:
class Singleton { //1,私有构造方法,其他类不能访问该构造方法了 private Singleton(){} //2,声明一个引用 public static final Singleton s = new Singleton(); }
模板方法设计模式:
使用场景:
当功能内部一部分实现时确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
abstract class GetTime{ public final void getTime(){ //此功能如果不需要复写,可加final限定 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 y=0; y<1000; y++){ System.out.println("y"); }}}
适配器设计模式:
1.什么是适配器:
在使用监听器的时候,需要定义一个类事件监听器接口。 通常接口中有多个方法,而程序中不一定所有的都用到,但又必须重写,这很繁琐。 适配器简化了这些操作,我们定义监听器时只要继承适配器,然后重写需要的方法即可。
2.适配器原理:
适配器就是一个类,实现了监听器接口,所有抽象方法都重写了,但是方法全是空的。 适配器类需要定义成抽象的,因为创建该类对象,调用空方法是没有意义的, 目的就是为了简化程序员的操作,定义监听器时继承适配器,只重写需要的方法就可以了。
上一篇: Pycharm快捷键