Javaの、デザインパターン - エージェントモデル

デザインパターン - エージェントモデル

I.概要

  1、プロキシモード

    (1)実際のオブジェクト:オブジェクトがプロキシされます

    (2)プロキシオブジェクト:エージェントの実際のオブジェクト

    (3)プロキシモード:プロキシオブジェクトプロキシ実オブジェクト、実際のオブジェクトの機能を向上させる目的

第二に、実装

  1、帯電防止剤:クラスファイルの記述プロキシモードがあります

  2、動的プロキシ:プロキシクラスが形成されている(コモンモード)メモリで

    実装手順:

      (1)プロキシオブジェクトと実際のオブジェクトは、同じインタフェースを実装します

      (2)プロキシオブジェクト=たとえば、Proxy.newProxyInstance()。

      (3)メソッドを呼び出すためにプロキシオブジェクトを使用して

      (4)拡張

       強化の道:

        ①パラメータリストを強化

        ②戻り値の型を強化

        強化体の③実行ロジック方法

第三に、ケース

  私たちは、どのようなダイナミックなエージェントを記述するために、コンピュータにこの事を買うために使用されます。

  私たちは、この時点で北京にレノボ、およびLenovoのコンピュータ会社を購入したい場合は、あなたがコンピュータを購入した場合、我々は、西安にあり、北京に時間のより多くの廃棄物を行かなければなりませんでした。

  これは、西安でのレノボのエージェントである、我々はここで、エージェントからコンピュータを予約することができ、およびエージェントは、私たちを迎えに北京に行ってきました。これは、動的プロキシを作成します。

  

  ここで:

    Lenovoの北京実際のオブジェクト=

    西安レノボ・エージェント=プロキシオブジェクト

  ここ西安エージェントは、販売市場を拡大し、西安を中心に強化された機能と同等のものをLenovoのコンピュータを販売することができます。

  コードは示して

  コンピュータインタフェースクラスを販売

1  パブリック インターフェースSaleComputer {
 2  
3      公共の文字列販売(二重お金)。
4  
5      公共 ボイドショー();
6 }

 

  実際のコンピュータのクラスを売ります

1  / * 
2  *実際のクラス
 。3   * / 
。4つの パブリック クラスレノボ実装SaleComputer {
 。5      @Override
 。6      パブリック文字列販売(ダブルマネー){
 。7  
。8          のSystem.out.println(+お金+ "を過ごした"「メタを買いますレノボ... " );
 9          リターン "レノボ" ;
 10      }
 11  
12である     @Override
 13である     公共 ボイドショー(){
 14          のSystem.out.println("コンピュータディスプレイ.... " );
 15      }
 16 }

 

  プロキシオブジェクトクラス

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 
 5 public class ProxyTest {
 6 
 7     public static void main(String[] args) {
 8         //1.创建真实对象
 9         Lenovo lenovo = new Lenovo();
10         
11         //2.动态代理增强lenovo对象
12         /*
13             三个参数:
14                 1. 类加载器:真实对象.getClass().getClassLoader()
15                 2. 接口数组:真实对象.getClass().getInterfaces()
16                 3. 处理器:new InvocationHandler()
17          */
18         SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
19 
20             /*
21                 代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
22                     参数:
23                         1. proxy:代理对象
24                         2. method:代理对象调用的方法,被封装为的对象
25                         3. args:代理对象调用的方法时,传递的实际参数
26              */
27             @Override
28             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
29                 /*System.out.println("该方法执行了....");
30                 System.out.println(method.getName());
31                 System.out.println(args[0]);
32 
33 
34 
35 
36 */
37                 //判断是否是sale方法
38                 if(method.getName().equals("sale")){
39                     //1.增强参数
40                     double money = (double) args[0];
41                     money = money * 0.85;
42                     System.out.println("专车接你....");
43                     //使用真实对象调用该方法
44                     String obj = (String) method.invoke(lenovo, money);
45                     System.out.println("免费送货...");
46                     //2.增强返回值
47                     return obj+"_鼠标垫";
48                 }else{
49                     Object obj = method.invoke(lenovo, args);
50                     return obj;
51                 }
52 
53 
54 
55             }
56         });
57 
58         //3.调用方法
59 
60         String computer = proxy_lenovo.sale(8000);
61         System.out.println(computer);
62 
63         proxy_lenovo.show();
64     }
65 }

 

おすすめ

転載: www.cnblogs.com/niujifei/p/11628090.html