zoukankan      html  css  js  c++  java
  • 代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。

    1,静态代理

    硬编码编写代理类,容易产生大量代理类(摘自网上)

    //代理接口
    public interface GiveGift
    {
        void giveDolls();
    
        void giveFlowers();
    
        void giveChocolate();
    }
    //追求者类
    public class Pursuit implements GiveGift
    {
        SchoolGirl    mm;
    
        public Pursuit(SchoolGirl mm)
        {
            this.mm = mm;
        }
    
        public void giveDolls()
        {
            System.out.println(mm.name + " 送你洋娃娃");
        }
    
        public void giveFlowers()
        {
            System.out.println(mm.name + " 送你鲜花");
        }
    
        public void giveChocolate()
        {
            System.out.println(mm.name + " 送你巧克力");
        }
    }
    //代理类
    public class Proxy implements GiveGift
    {
        Pursuit    gg;
    
        public Proxy(SchoolGirl mm)
        {
            gg = new Pursuit(mm);
        }
    
        public void giveChocolate()
        {
            gg.giveChocolate();
        }
    
        public void giveDolls()
        {
            gg.giveDolls();
        }
    
        public void giveFlowers()
        {
            gg.giveFlowers();
        }
    }
    //客户端代码
    public class Main
    {
        public static void main(String[] args)
        {
            SchoolGirl jiaojiao = new SchoolGirl();
            jiaojiao.setName("李娇娇");
    
            Proxy daili = new Proxy(jiaojiao);
            daili.giveDolls();
            daili.giveFlowers();
            daili.giveChocolate();
        }
    }

    2,动态代理

    java中有接口InvocationHandler(java.lang.reflect)

    通过实现一个InvocationHandler,产生一个动态代理类。

    编写一个接口如下:

    public interface Subject {
    	public void doSomething();
    }
    

     实现接口:

    public class RealSubject  implements Subject{
    
    	@Override
    	public void doSomething() {
    		// TODO Auto-generated method stub
    		System.out.println("call doSomething");
    	}
    

      编写动态代理类:

     1 import java.lang.reflect.InvocationHandler;
     2 import java.lang.reflect.Method;
     3 
     4 public class ProxyHandler implements InvocationHandler {
     5 
     6     private Object proxied;
     7 
     8     public ProxyHandler(Object proxied) {
     9             this.proxied=proxied;
    10     }
    11 
    12     @Override
    13     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    14         // TODO Auto-generated method stub
    15         
    16         System.out.println("开始执行");
    17         Object obj= method.invoke(proxied, args);
    18         System.out.println("结束执行");
    19         return obj;
    20     }
    21 
    22 }

    client调用:

    import java.lang.reflect.Proxy;
    
    public class DynamicProxy {
    
        public static void main(String[] args) {
    
            RealSubject real=new RealSubject();
            
            Subject proxySubject=(Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class}, new ProxyHandler(new RealSubject()));
            
            proxySubject.doSomething();
            
            System.out.println(Proxy.isProxyClass(proxySubject.getClass()));    
    
        }
    
    }
  • 相关阅读:
    [LeetCode]Reverse Linked List II
    [LeetCode]Remove Duplicates from Sorted List II
    嵌入式培训学习历程第六天
    嵌入式培训学习历程第五天
    嵌入式培训学习历程第三天
    嵌入式培训学习历程第二天
    嵌入式培训学习历程第一天
    shell编程
    找整除--全国模拟(二)
    最长公共连续子串--全国模拟(二)
  • 原文地址:https://www.cnblogs.com/suzixuan/p/6941749.html
Copyright © 2011-2022 走看看