zoukankan      html  css  js  c++  java
  • java--01--静态代理

    1. 代理模式
    1.1 概述
     代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。
    举例:明星(苍老师)<---精济人<-------用户  
            目标           (代理)
    
     
    
    代理模式的关键点: 代理对象与目标对象。
    
    
    1.2 静态代理
    静态代理,
        1) 代理对象,要实现与目标对象一样的接口;
        2) 举例:
                保存用户(模拟)
                    Dao  ,  直接保存
                    DaoProxy, 给保存方法添加事务处理
    
    总结静态代理:
        1)可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。
        2)缺点:
            --》  因为代理对象,需要与目标对象实现一样的接口。所以会有很多代理类,类太多。
            --》  一旦接口增加方法,目标对象与代理对象都要维护。
    
    解决:
        代理工厂?  可以使用动态代理。
    

      接口:(跳舞, 还是唱歌?)

    1 public interface IUserDao {
    2 
    3     void save();
    4     
    5     void update();
    6 }
    View Code

    目标对象把活全干完,唱歌跳舞都必须要干

     1 // 目标对象
     2 public class UserDao implements IUserDao{
     3 
     4     @Override
     5     public void save() {
     6         System.out.println("目标对象,插入数据到DB中...");
     7     }
     8 
     9     @Override
    10     public void update() {
    11         System.out.println("目标对象, 修改数据...");
    12         
    13     }
    14 
    15 }
    View Code

    代理对象向外宣称苍老师会唱歌会跳舞

     1 // 代理对象, 代理谁? 把目标对象拿进来初始化
     2 public class UserDaoProxy implements IUserDao{
     3 
     4     private IUserDao userDao;
     5     public UserDaoProxy(IUserDao userDao){
     6         this.userDao = userDao;
     7     }
     8     
     9     @Override
    10     public void save() {
    11         System.out.println("代理对象, 开启事务");
    12         userDao.save();//目标对象
    13         System.out.println("代理对象, 提交事务");
    14         
    15     }
    16 
    17     @Override
    18     public void update() {
    19         System.out.println("代理对象, 开启事务");
    20         userDao.update();//目标对象
    21         System.out.println("代理对象, 提交事务");
    22     }
    23     
    24 
    25 }
    View Code

    来吧...

     1 public class ProxyTest {
     2 
     3     public static void main(String[] args) {
     4         //1.静态代理
     5 /*        IUserDao target = new UserDao();
     6         IUserDao proxy = new UserDaoProxy(target);
     7         proxy.save();
     8         proxy.update();
     9         */
    10         /*
    11         代理对象, 开启事务
    12         目标对象,插入数据到DB中...
    13         代理对象, 提交事务
    14                 
    15         开启事务
    16         目标对象, 修改数据...
    17         提交事务
    18          */
    19         
    20         //2.动态代理
    21         IUserDao target = new UserDao();
    22         IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    23         proxy.save();
    24         proxy.update();
    25         /*
    26          开启事务
    27         目标对象,插入数据到DB中...
    28         提交事务
    29         
    30         开启事务
    31         目标对象, 修改数据...
    32         提交事务
    33          */
    34     }
    35 }
    View Code
  • 相关阅读:
    VC.【转】采用_beginthread/_beginthreadex函数创建多线程
    Qt532.【转】Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt
    Qt532界面.ZC测试
    Qt532.【转】Qt创建鼠标右键菜单
    VC.【转】窗口置于前台并激活的方法
    VS2010.STL::list的一个bug
    STL_map.VC6简单使用例子
    LeetCode题解-----Maximum Gap
    CEPH块设备创建及快照
    Ubuntu 14.04 部署 CEPH集群
  • 原文地址:https://www.cnblogs.com/bravolove/p/8179848.html
Copyright © 2011-2022 走看看