1.单例模式
1.1 概念
表示在工程中使用的永远是一个对象
1.2 实现单例模式的设计
懒汉模式 :第一次使用的时候创建对象
饿汉模式: 加载类的时候创建对象
1.3 单例模式的实现
2.代理
2.1 定义
实现核心的业务逻辑之外,新增的非核心业务逻辑的类,新的类就叫代理类
2.2 静态代理
public interface UserDAO {
void insert();
void delete();
void update();
}
public class UserDAOImpl implements UserDAO{
@Override
public void insert() {
System.out.println("增加数据");
}
@Override
public void delete() {
System.out.println("删除数据");
}
@Override
public void update() {
System.out.println("修改数据");
}
}
public class UserDAOProxy implements UserDAO{
private UserDAOImpl userDAOImpl;
public UserDAOProxy(UserDAOImpl userDAOImpl){
this.userDAOImpl=userDAOImpl;
}
@Override
public void insert() {
System.out.println("开始事物");
userDAOImpl.insert();
System.out.println("提交事务");
}
@Override
public void delete() {
System.out.println("开始事物");
userDAOImpl.delete();
System.out.println("提交事务");
}
@Override
public void update() {
System.out.println("开始事物");
userDAOImpl.update();
System.out.println("提交事务");
}
}
public class TestProxy {
public static void main(String[] args) {
UserDAO dao=new UserDAOProxy(new UserDAOImpl());
}
}
2.3 动态代理
public interface UserDAO {
void insert();
void delete();
void update();
}
public class UserDAOImpl implements UserDAO{
@Override
public void insert() {
System.out.println("增加数据");
}
@Override
public void delete() {
System.out.println("删除数据");
}
@Override
public void update() {
System.out.println("修改数据");
}
}
/*
* 动态代理是程序运行过程中,动态创建的代理对象
* 动态的代理对象需要通过方法获取
* 通过辅助接口InvocationHandler,实现代理核心业务方法和新增服务的设置
*/
public class UserDAOProxyHandler implements InvocationHandler{
//表示核心业务逻辑类对象
private Object object;
public UserDAOProxyHandler(Object object){
this.object=object;
}
/*
* 使用反射的功能实现方法的调用
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始事务");
Object obj=method.invoke(object, args);//调用核心业务方法
System.out.println("提交事务");
return obj;
}
}
public class TestDyna {
public static void main(String[] args) {
UserDAOImpl obj=new UserDAOImpl();
UserDAOProxyHandler h=new UserDAOProxyHandler(obj);
//获取代理类对象
//第一个参数表示获取业务逻辑类的类加载器的对象
//第二个参数获取业务逻辑类的接口类型
//第三个参数表示实现InvocationHandler接口的实现类的对象
UserDAO dao=(UserDAO)Proxy.newProxyInstance(UserDAOImpl.class.getClassLoader(),
UserDAOImpl.class.getInterfaces(), h);
//调用哪个方法,就代理哪个方法
dao.insert();
}
}