设计模式浅谈

1.代理模式proxy

所谓的代理模式就是在原有的服务上加了一个占位,通过这个占位可以控制服务的访问和对一些功能的增强。可举例说明。

1.1动态代理

1.1.1JDK动态代理

/**接口*/
public interface HelloService{
public void sayHello(String name);
}
/**实现类*/
public class HelloServiceImpl implements HelloService{
@Override 
public void sayHello(String name){
	System.out.println("Hello "+name);
	}
}
/**代理类*/
public class HelloServiceProxy implements InvocationHandler{
	/**真实的服务对象*/
	private Object target;
	/**生成代理对象*/
	public Object bind(Object target){
		this.target=target;
		return Proxy.newProxyInstance(target.getClass.getClassLoader(),target.getClass().getInterface,this);
	}
	/**实现InvocationHandler接口的invoke方法*/
	public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
		Object result=null;
		//通过反射调用实现类的方法
		result=method.invoke(target,args);
		return result;
	}
}
/**测试类*/
public TestJdkProxy{
	public static void main(String[] args){
		HelloServiceProxy helloHandler=new HelloServiceProxy();
		HelloService proxy=(HelloService)helloHandler.bind(new HelloServiceImpl());
		proxy.sayHello("张三");
	}
}

1.编写接口和实现类,jdk动态代理接口是必须要的
2.编写代理类,实现InvocationHandler接口,实现bind方法生成代理对象bind(实现类对象target),Proxy.newProxyInstance(类加载器,接口,代理类this),实现invoke方法,通过反射调用实现类的方法。

1.1.2CGLIB动态代理

public class HelloServiceCglib implements MethodInterceptor{
	private Object target;
	/**创建代理对象*/
	public Object getInstance(){
		this.target=target;
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		//回调方法
		enhancer.serCallback(this);
		return enhancer.create();
	}
	@Override
	//回调方法
	public Object intercept(Object obj,Method method,Object[]args,MethodProxy proxy)throws Throwable{
		Object returnObj=proxy.invokeSuper(obj,args);
		return returnObj;
	}
}

1.可以不需要提供接口,实现MethodInterceptor接口,getInstance()方法获取代理对象,实现intercept()方法,通过反射调用实现类的方法。

1.2 使用场景

1.Mybatis的运行原理,mapper接口没有实现,通过动态代理实现接口,嵌套查询的懒加载是用的CGLIB动态代理。
2.spring中的AOP底层也是动态代理。

2.单例模式singleton

1.什么是单例模式?优点是什么?使用场景?
所谓单例模式就是整个程序只有一个实例。
优点:节约内存,减少频繁创建提高效率。
使用场景:Mybatis中SqlSessionFactory对象,applicationContext等。
2.常用的几种模式
懒汉式,饿汉式,双重校验锁,静态内部类,枚举。

/**懒汉式
   如果不加synchronized,出现线程不安全创建多个实例,不是单例模式
*/
public class Singleton {

    private static Singleton instance = null;
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        //如果还没有被实例化过,就实例化一个,然后返回
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
/**饿汉式*/
public class Singleton {
    //类加载的时候instance就已经指向了一个实例
    private static Singleton instance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}
/**双重校验锁*/
public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
/**静态内部类*/
public class Singleton {

    private static class SingletonHolder{
        private static Singleton instance = new Singleton();
    }

    private Singleton(){}

    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
/**枚举*/
public enum Singleton {
    INSTANCE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值