7.静态代理模式的做法和缺点

代理模式

对代码增强

 

静态代理模式的缺点:

1、如果一个系统中有100Dao,则创建100个代理对象

    2、如果一个dao中有很多方法需要事务,则代理对象的方法中重复代码还是很多

    3、由第一点和第二点可以得出:proxy的重用性不强

 

例子:利用代理类和被代理的类实现相同的接口,在代理类中构造方法放入被代理类对象和要添加的功能。

 

接口personDao.java

public interface PersonDao {

public void savePerson();}

 

实现类

public class PersonDaoImpl implements PersonDao{

public void savePerson() {

System.out.println("save person");}

 

事务处理类

public class Transaction {

public void beginTransaction(){

System.out.println("开启事务");}

public void commit(){

System.out.println("关闭事务");}

}

 

dao代理对象

public class PersonDaoProxy implements PersonDao{

private PersonDao personDao;

private Transaction transaction;


public PersonDaoProxy( PersonDao personDao, Transaction transaction){

this.personDao = personDao;

this.transaction = transaction;}

public void savePerson() {

transaction.beginTransaction();

personDao.savePerson();

transaction.commit();}}

 

对象产生:applicationContext.xml

    <bean id="personDao" class="proxy.cn.itcast.proxy.PersonDaoImpl" ></bean>   

    <bean id="transaction" class="proxy.cn.itcast.proxy.Transaction" ></bean>    

   <bean id="personDao2" class="proxy.cn.itcast.proxy.PersonDaoProxy">

   <constructor-arg index="0" ref="personDao"></constructor-arg>

   <constructor-arg index="1" ref="transaction"></constructor-arg>

   </bean>

 

测试

public class ProxyTest {

@Test

public void testPersonDao(){

ApplicationContext context = new ClassPathXmlApplicationContext("/proxy/cn/itcast/proxy/aplicationContext-proxy.xml");

PersonDao dao = (PersonDao) context.getBean("personDao2");//这是代理类了

dao.savePerson();}}