設計模式---動態代理簡單實現以及思路

前言:

代理模式可以類比於歌手與經濟人的關係,如果你想讓歌手唱歌,那麼通過經紀人就可以解決訂票、籤合同、唱歌(歌手唱歌)、收尾款等一些活動。

一、理論

代理模式(proxy pattern)

 核心角色:

      抽象角色:(歌手和經濟人都是人)

         定義代理角色和真實角色的公共對外方法

     真實角色:(歌手)

          實現真實角色,定義真實角色所要實現的業務邏輯供代理角色調用

          關注真正的業務邏輯

     代理角色:

                實現抽象角色,是真實的角色代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作

               將統一的流程控制放到代理角色中處理

二、靜態代理

一、類結構

  1.  Star(抽象類或者結構--人)

    public interface Star {
    	/**訂票*/
     void BookTicket();
     /**籤合同
      * 
      * 
      * */
     void signContract();
     /*
      * 唱歌 (歌手能夠唱歌,但是代理人不能唱歌)
      * 
      * 
      * */
      void sing();
      
      /*收尾款
       * 
       * 
       * */
       void  endMoney();
    }
    
  2. SingStar(歌手)代碼:

    //歌手實現了人接口
    public class SingStar  implements Star{
    
    	@Override
    	public void BookTicket() {
    		// TODO 自動生成的方法存根
    		System.out.print("訂票了啊啊 ");
    	}
    
    	@Override
    	public void signContract() {
    		// TODO 自動生成的方法存根
    		System.out.println("籤合同了 啊啊啊");
    		
    	}
    
    	@Override
    	public void sing() {
    		// TODO 自動生成的方法存根
    		System.out.println("周杰倫唱歌了");
    	}
    
    	@Override
    	public void endMoney() {
    		// TODO 自動生成的方法存根
    		System.out.println("收尾款");
    	}
    
    }
    
  3. ProxyStar(代理人)代碼:

    /**
     * @author zhangyang
     *
     */
    //經紀人的實現
    public class ProxyStar  implements Star{
        private Star star;//利用了組合關係
    	public ProxyStar(Star singstar) {
    		this.star = singstar;
    	}
    
    	@Override
    	public void BookTicket() {
    		// TODO 自動生成的方法存根
    	  System.out.println("代理人訂票!");
    	}
    
    	@Override
    	public void signContract() {
    		// TODO 自動生成的方法存根
    		System.out.println("籤合同!");
    	}
    
    	@Override
    	//調用的歌手唱歌的方法
    	public void sing() {
    		// TODO 自動生成的方法存根
    		star.sing();
    	}
    
    	@Override
    	public void endMoney() {
    		// TODO 自動生成的方法存根
    		System.out.println("代理人收尾款了");
    	}
    
    }
  4. Client(客戶)代碼:

public class Client {
public static void main(String[] args) {
	  Star singstar=new SingStar();
	  Star proxystar=new ProxyStar(singstar);
	  //將他代理
	  proxystar.BookTicket();
	  proxystar.signContract();
	  proxystar.sing();
	  proxystar.endMoney();
}
}

      實現結果:

 二、動態代理

   動態代理在本質上使用了反射的機制。

 實現:

    一、類結構

  1. Star代碼(同上)
    //調用相關的抽象角色
    public interface Star {
     void bookTicket();
      void sing();
       void endMoney();
       
    }
    

     

  2.  RealStart(歌手)
    public class RealStar  implements Star{
    
    	@Override
    	public void bookTicket() {
    		// TODO 自動生成的方法存根
    		System.out.println("歌手訂票!");
    	}
    
    	@Override
    	public void sing() {
    		// TODO 自動生成的方法存根
    		System.out.println("歌手唱歌!");
    	}
    
    	@Override
    	public void endMoney() {
    		// TODO 自動生成的方法存根
    		System.out.println("歌手收尾款!");
    	}
    
    }
    

     

  3. StartHandler(代理操作)
    public class StarHandler  implements InvocationHandler{
       private  Star realstar;
    	public StarHandler(Star realstar) {
    	super();
    	this.realstar = realstar;
    }
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		// TODO 自動生成的方法存根
    		System.out.println("####");
    		//將自身的RealStar對象變成代理
    		method.invoke(realstar, args);
    		
    		return null;
    	}
    
    }

     

  4. Client(客戶)
import java.lang.reflect.Proxy;
import java.util.logging.Handler;

public class Client {
public static void main(String[] args) {
	 Star star=new RealStar();
	 StarHandler starHandler=new StarHandler(star);
	 //返回一個代理類,相當於經紀人
	Star star2=(Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class}, starHandler);
	star2.bookTicket();
	star2.sing();
	star2.endMoney();
}
}

  實現結果:

調用的都是RealStar類對象的方法 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章