------- android培训、java培训、期待与您交流! ----------
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
需求:
1、使用静态代理模式,对数据库中的数据进行增删改查操作
2、对每一个操作,都需要对其进行日志记录
那么我们先以静态代理进行示例展示
1、接口StaticProxy_Interface
package com.proxy.static_proxy;
/*
* 演示静态代理类
*
* 功能:定义一个接口,用于对数据库进行操作
*
* @author lijl
* */
public interface StaticProxy_Interface {
//插入
public void Insert();
//删除
public void Delete();
//修改
public void Update();
//查询
public void Select();
}
2、StaticProxy_Impl 委托类
package com.proxy.static_proxy;
/*
* 演示静态代理类
*
* 功能:业务逻辑类,即委托类
* 本类实现StaticProxy_Interface接口,对数据库的模拟增删改查功能
*
* @author lijl
* */
public class StaticProxy_Impl implements StaticProxy_Interface {
@Override
public void Insert() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Insert()...........");
}
@Override
public void Delete() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Delete()...........");
}
@Override
public void Update() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Update()...........");
}
@Override
public void Select() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Select()...........");
}
}
package com.proxy.static_proxy;
/*
* 演示静态代理类
*
* 功能:静态代理类
* 本类实现StaticProxy_Interface接口,对数据库的每一个操作,都需要留下日志痕迹
*
* @author lijl
* */
public class StaticProxy implements StaticProxy_Interface {
//由于需要对数据库的增删改查等操作留下日志,那么需要传递进来对数据库进行操作的业务逻辑类,即委托类对象staticproxy_impl
private StaticProxy_Impl staticproxy_impl;
public StaticProxy(StaticProxy_Impl staticproxy_impl){
this.staticproxy_impl = staticproxy_impl;
}
@Override
public void Insert() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Insert()..begin..");
staticproxy_impl.Insert();//对插入数据库操作,前后加入begin end 日志
System.out.println("StaticProxy.Insert()..end..");
}
@Override
public void Delete() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Delete()..begin..");
staticproxy_impl.Delete();//对删除数据库操作,前后加入begin end 日志
System.out.println("StaticProxy.Delete()..end..");
}
@Override
public void Update() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Update()..begin..");
staticproxy_impl.Update();//对更新数据库操作,前后加入begin end 日志
System.out.println("StaticProxy.Update()..end..");
}
@Override
public void Select() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Select()..begin..");
staticproxy_impl.Select();//对查询数据库操作,前后加入begin end 日志
System.out.println("StaticProxy.Select()..end..");
}
}
4、
package com.proxy.static_proxy;
/*
* 演示静态代理类
*
* 功能:主函数,执行静态代理类(执行委托类并且带日志功能)
*
* 1、创建委托类(业务逻辑类)对象
* 2、创建静态代理类对象,将委托类对象作为参数,传递到StaticProxy构造方法中
*
* @author lijl
* */
public class StaticProxy_main {
public static void main(String[] args) {
// TODO Auto-generated method stub
StaticProxy_Impl spi = new StaticProxy_Impl();
StaticProxy sp = new StaticProxy(spi);
sp.Insert();
sp.Select();
sp.Update();
sp.Delete();
}
}
总结:从以上例子中就可以看出静态代理类的功能,
这里举一个比较形象的例子,比如有三个对象:思科服务器生产商、服务器代理商、用户
1、用户想要去买思科服务器,当然也需要售后的保障(思科服务器好比StaticProxy_Interface接口类)
2、用户最终要的结果是:买,那么买,那么以面向对象的思维看待StaticProxy_Interface接口,实际上就是StaticProxy_Interface接口需要有被人买的动作,那么这个接口就需要定义买的动作, 即本例中的增删改查
3、那么思科服务器,从哪里来呢?首先思科服务器是由生产商生产的,那么肯定生产商要去实现StaticProxy_Interface接口,重写里面的方法,买的动作,即StaticProxy_Impl。
4、由于思科生产商,自己不去单独卖服务器,需要去委托给代理商外卖,即将服务器交给代理商,而且代理商要给用户提供售后的服务,在本例中就是StaticProxy代理类,StaticProxy代理类中需要有StaticProxy_Impl生产商给的服务器对象即设计StaticProxy时,构造方法需要传递服务器StaticProxy_Impl并且对思科服务器的每一个产品,进行售后服务,即代理类StaticProxy中的增删改方法中需要有日志功能
5、当用户去买服务器的时候,即main函数,去代理商StaticProxy这里买,前提供货商StaticProxy_Impl需要把服务器交给代理商StaticProxy
-------android培训、JAVA培训、期待与您交流! ----------
--------详细请查看www.itheima.com-------------