代理模式

  代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。

  这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。

代理模式的关键点: 代理对象与目标对象。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAi4AAACsCAIAAADTz7ByAAAgAElEQVR4nO2dd1hT1//HD85q1bYWR79qHXVUrXvVaquti59VrHvUgeJCa0Woe1RRcYGIoKgg4kJUkL1BQUGGIjMhIYEMkpBBEkb2ur8/rg2IguGSkCuc13OfPpgm577vOu97zvmczwEIBAKBQCBmBZhbAAQCgUBaO2a2Ip1OR2OJNFqteWV8EJ0OoeNcmwZqazS41sYWqXGrjQW1YQHv11SNF23QiuoFWhE28KwNgVaEFVxX93jWhvNrCq0IBVoRNvBc3eNZGwKtCCu4ru7xrA3n1xRaEQq0ImzgubrHszYEWhFWcF3d41kbzq8ptCIUaEXYwHN1j2dtCLQirOC6usezNpxfU2hFKNCKsIHn6h7P2hBoRVjBdXWPZ204v6bQivTQWCKtTmduFR+GjnNtWqit0eBaG1ukwa02FtSGBbxfUw1etL21IrlSbZ5NoSpmCqVypdkENKRNjXdtMqit0RuutZUKJbjVxoTaMGnD+TWVml/bO1bEYIvMtRGoXLr59t7wRsS5Npb5ZUBtxtVGg9qgtlam7R0rMiN0lkiH4KWRWAcGzrXhteEPtWGDWVZpbgn1wsBxxyautXFwrI0l0uKtg85cwLAFbOA5NADP2hBThi1oNJqKigqRSCTGCoFMF5QLMf/cWIhEIomkWvfuKCmuQwPwrA2GLRgGtKJ6gVaEDTxrQ0xpRUwmMysri0gkFn7iEInEV69eVVdX1zlvuK5ScasNWpFhQCuqF2hF2MCzNsSUVkShUAQCgSlKbn7IZLJQKKz9Ca6rezxrg1ZkGNCK6gVaETbwrA0xpRVRqVQul2uKkpsfEokkEolqf4Lr6h7P2qAVGQa0onqBVoQNPGtDoBUZBolEqtNBx+FLzCXmo0Arwga0ohqgFWEDz9U9nrUh5rOiqqqqqqoqBEEqKiokEiNU60KhUKlU1tlF04tFIZFIdDpdKBSK/iOXUCIQlItqUV1drVarVe+iNcfzAq0IG9CKaoBWhA08V/d41oaYz4o8PDzc3d0RBDl27FhoaCiVSiUSiXW+o1Qqb9265eHhgf43ICBAo9HUV+C2bduys7P1/3z58uWoUaMuXbp09epVb29vX1/fpgxcFRUVzZw5c/jw4T/8x7BhNX//8MMPI0aMmD59+sqVK5fVYunSpTY2NkeOHHFycrp9+7a/v39cXFxycnJOTg6VSmWz2XK53BReBa0IG9CKaoBWhA08V/d41oYYyYpIpRXPC7hsoUyuqrEKeklxA1bk6up68eJFBEEOHDgQGBhYXFxsb29Pp9MRBPH09Ny0aZOtrW1ISMj06dOvXr36/fffX79+feLEiRwOB0EQNptta2tra2u7adOmiIgIiURSUVGxatWqp0+fyuVyBEHi4uLs7OycnZ2PHj16+vTp+fPnjxw5kkwmY673i4qKvv76a2AMLCwsvv7664EDB44cOXLmzJnz5s2zsbGxtbX9999/PT09Q0ND37x5w+fzm2JR0IqwAa2oBmhF2MBzdY9nbYiRrIhVLg1Mobs+IbiHEJ6k0jOLBEyBNDufVFaPFTEYjO3bt6vVagRBTp06FRMTgyDI9OnTL1y4gCAImUw+duzYhg0biETismXL0tPT58yZ8/r164ULF7LZbARB1Gp1fn5+RkbG6dOnd+3adfbs2RUrVgwcOHD27NkPHz5EEGTSpElTp049evTosWPH/vjjjw0bNtjY2NjY2Dg6OmI7QDKZHBQUFFo/4eHhfn5+J0+edK7FmTNnDh8+vH79+lWrVk2ePHn8+PGDBg3q06fPl19+2b59+/q8qkuXLt98882IESOsrKy2b99++vTpO3fuvHjxgkAgMBgMkUj0UZeCVoQNaEXvANOhYgPXaT1bjTZ+hfx2InXlmaRFJ5Nc7z8XCss/+LX9+/fb2NjEx8cfO3Zs+vTpa9eudXJysre3d3Z2Rr8QGRnp6upaWVk5ZswYBweHYcOGOTo6Tpo0Ce1kYzAYL168QBDk7NmzUVFRCILodLoNGzakpaWh1fStW7emTp16/PjxEydOfPfdd9u2bfv33383bdq0aNEibMdFIpFkMhm239ZGKBQyGIycnJyEhITIyEgfHx9PT8+jR486ODhs3LjRyspqzJgxPXv2/KBFtWvXrn///tOmTfvzzz9PnTp1586dtLQ0Ho/3/l5KyyrxervBdKiG8taKlCqNWTaFUl3MFMoUKnMJaFCbpgTn2uRQW6M3zNpUag2i0yEIotFoxdXKArooILnkTECuX3zR8XvZ+3zfJKfnCsv57z9jAQEB69at27lz56tXr+7cuTNnzpy///47NTVV/wVXV9dp06aNHTs2ODh4/fr1IpFoyZIllZWVCxYsYDAYCIJwudx///3Xz89vz549CIK4u7tLpdKtW7dmZWWhJWg0msTExDNnzlhZWW3evPnRo0dBQUFXr17Vf6GxvB/MbQoUCkVZWRmRSExNTQ0LC7t69eqBAwdWrVo1bdq03r17d+7cuY45de3adcSIEbNnz969e7e3t3dycrJQKJTJZLTSmilQWp3ZarMP32+lQimOnwWpzPza0Atn5nSodDQdKkto9pR8H9RGhNpaljZGY7VxREyOmM2rEJRXsbkVL/NY9+NJboG5zgG5bk8KAp5RXxE5QUmU4/fevCkSFBQQ+fwPvLMLhcKsrKzNmzej/wwICPD29q79hbKyssuXL+/Zs6e8vHzlypUrV67s37//2rVrN2zYIJVK9V/7v//7P/SHUVFRu3btsre3f/XqFVqhP378OCIi4uTJkydPnjx16hSFQuFyuWfOnME8ANM8VvRBNBqNTCYTi8U0Gi05OdnX1/fw4cPW1tYTJkywtLSs7Uxt2rSxtLScOGnK4qWrjzmd87v35NmL1yWl5dVyRFStKSuXlpZVMDkVDI7YvPcbDcfPAh60odcddtA1BOygw0YL01YqkES+KvUII16JKLwZW5SQzSkTve28Ki6rcn6YRy2rQhCkuLjeCLo3b95s2rRJ/88//vgDbe7oCQ8P37dvH/q3WCxeuXJlnRJSUlLWrl1rZWWFIEh5eXl8fPz27dtRK5JKpU5OTocOHTp27NjJkyd37tw5bty4PXv2sFisRh1mbcxoRfVRXV2dk5MTGBh48eLFbdu2/fTTTz169KjTbBo0aNCSJYuP//tvUFAQk8n4eKGmB3bQGQgMW6gXGLaADTxrQwwOWxBWKQgMcUga0/VJgeuTgqBU+mtKOb9CXvs7hcyKUw9y8uhvq+wGgrlfv35d24pSUlIOHTokFouPHz+uUCiIROKVK1emT5+emppqa2u7ePHifv36rVixYsuWLWiAnE6n+/vvvyMiIvz9/dFIBwRBbGxsUCtCEEQsFh89etTJyengwYMXLlxYvny5q6traGho40/PW3BoRXUQiURUKjUtLe3atWv29va//PLLN998U9uW+vXr9/PPP+/duzc4OJhGo1VWmifrOQxbMBBoRfUCrQgbeNaGfMyKyisVz/O5t+IpHmHESyHEJ6kMKqdKofrw5J7kfG5mUc3cnQas6NWrVxs2bKj9SWJi4rZt26ZOnYogiIuLy4kTJ9AwAZ1OJxAIlixZolKp0NzYarXaxcXFx8cHQZA3b974+/ujJdja2mZkZCAIIpPJXFxcjh49un379gcPHmg0muXLl2u1Wmdn5+PHj+fn5zfi7PwH/q3ofdhsdkhIyMGDBxcuXPjdd9/VtqVOnTpNnz597969jx8/plKpzakKWpGBQCuqF2hF2MCzNuRDVqRQacpE0vhstkcY8VII4XYCJTaLzWx8nhsmk8nnfyBsAUGQ3NzcHTt21PkwOTn5119/rT2cc/bs2e3bt2/cuHHEiBHbtm3bvn37lStXEAR5+vRp7R+KxeItW7aMGjUKrVVVKpWPj8+NGzcQBMnIyPjzzz9jY2PRb3p5eZHJ5MYeCIIgZDL5k7Oi2hQXF0dFRV28eHH58uV9+/atbUvffffdihUrbty4wWAwmiE3BLQiA4FWVC/QirCBZ20IgjA5YvSPKpkqny4KS2N6hBHPP86/96z4DVXIe7cLzkAkEklmZmZMTExVVZVOp5PJZEKhUFALNptNJpMF7yKVSqlUKo/H03+SmpoaHx+fkJCQnp4eHx8fHx+fmZkpEAjkcnmd0uLj49PS0rhcrkAgKC8v12g0Wq1WJBIRicTExMTq6mqBQCAUCrVabVVVlaCR8Pn8rKwssVhs1BNvHlQqFZ/PT09Pd3FxWbx48eDBg/We9PXXX8+dO/fatWu5ublGScX0QaAVGQi0onqBVoQNPGtDEIRQzE8p4PolUD3DCz3DCx89p5FKK7BdZalUmpCQ4OzsbGVlhQ5OrF+//s8//3Rzc8vIyCiqBZVKpdFoRe9Bp9Nr/5PBYJS+S50voFAoFPT/UiiUOv+rpKTkg583CjKZTKVSVSqV0U++2eFwOHfv3t25c+fYsWP1ntS+fXsrK6uzZ88+ffq0Tlq/pgOtyECgFdULtCJs4FCbQqXhCGVJeWXXo8jH72Z5R5MTcjgUdiW28EilUpmfn3/o0KFx48Z16NBBPxrx/fff7961MzQkmEAgGL1GgxiXsrKyxMTEI0eOjBs37rPPPkMvYseOHSdNmnTs2DEikWisKwityECgFdULtCJs4EebSq3Np4vC0pneMUXnHuffjKVkkgW5FJ5KXW+O0YYpKSm5e/fuokWLOnbsiFZeX3zRbc7s2f8eO5r9OkOrVvIrVXLzH/eHKeZU0XnVH/9eK0Mul2dkZBw9enTWrFlffvml/sVi0aJF9+7dKy4ubmL50IoMBFpRvUArwobZtckUmteU8jsJ1EuhhGuRpEfPaTnFQn0UXClHrGvkPA+VShUTE7Njx44hQ4boe3VmzphxxeNS1qsMrU6n0CEvCkXescXXoooIDJwOsQSm0FefSw5+yVDipvbBGxkZGW5ubjNmzKgd47Bly5awsDCFQoGtTGhFBgKtqF6gFWHDLNq0Oh2DJ0kh8G4nUJ0D8q5GkBJyONSyKpmybgOoUdrIZPLFixcnT56s74gbOGCA/d87szJf8stFAimSWVztHUN1DSI8fkHPLRHxK+Q6vM6JfvScvuLMs/2+r70iCwuZFeaWg18qKipSUlJ27do1aNAg9KK3bdt2/PjxTk5OOTk5jR1Cg1ZkIGbPtqCjsURaHV5ORx3oONeGS5tEmldbEbsyLJ15M5ZyKZjoHUNOK+QLqxUNuIGB2uLi4rZs2dK1a9f/sp91Wb5sia/PDR6PyxDI4/PK7yYxPMNJ958VE5ji+iYe4YrAFLpbMOFeYvHronK3YEJQKr1CWu9wSJVUBRtPQqHw1q1by5cv/+qrr9DboEOHDitXrgwODjbckOhsnL7OIqZcuwsDb61IpdaYZVOq1MWlQrlSZS4BDWrTlOBcm6IVadO/Wmq02gqpsoAhvv+s2PlhrtuTggdJxS+JPGHl2zhsrVar1mjrK6c+behv0XxuCxYsaNu2LQCgrQX4cdL4i64Xkl68LOFKkgsrPSOKfGIpoWnM3BLRp1VZ34qj5BQLvSJJxWVVVTKVb2zRzdii+nLSZBYJgtNwkTgHD2RnZ7u5uf34448WFhaoJ/3666++vr76ZXPV6obuNxkun9O32uTm14aew7dWRGeLzLOxhAQKl8YSmk1AQ9pEUJvZtTHYIjb3bTbS1FyWfzzJIyT/dECOS1DBw2eUpGwmsZjP4VXwyytZZWJDCqyjjcEWcwSSCqkuu6D4gtvVSZOmoHXNl90+X7nsj6Dg8OfZtPhcwe0klmcEOfpVKY1bLZGrzVMjNg3PsEJ2ufQ1RXA9ioR+IqxS1NebWCVXnQ/Mp3KMtkJ5C6C6uvr58+d//vmnvpE0YuSof0+eS3tVUCHVcculDM4H7kACFa/PKfoslJpfG3p68dFBh+MGLK614aZxXQfjamPwJeEZpV6RpMuhRN9YSmIOh49pImp92ng8rru7++TJk96a0BddN2za7HbzyYPnjNvPSv0SaRGZrBYQe3b2UR5bKNXpdG4hBKIBY0XpJMG1SBJuxznMSFpa2t9//929e/e3hjRi+OnTp+uLtaOzcdQJVgc6S6TBTcsehi3UCwxbwIZRtImqlUSmOCKDeSEo3y2Y8CSV8X42UmzU1kan00+ePDn4u4FondL5i57Wf+48cjXicnhRYDrvBYFfXNZymgVXwgtFVQoEQdJJfK8I0keDKzQa3dUIUgZZ8LEvtlIKCwuPHDkyYMAA9Obp37+/g4MDkUis8zU6DFswDGhF9QKtCBtN0cavkD/P595/VuIeSrwUQghLZ5ZwPxAF1xRKuZUIgvB4XFeXC33/1xud2vjFwCnzbI6fupvu95SezZBWSNW4rT4wI1Wo0Sm9MoXGI6wwj/bxFHMkVoV7KPET7ZBsHths9tmzZydMmIAakqWl5ZEjR2qvAAKtyECgFdULtCJsNFabSq1ll0sTcziXw4huwQS/eEp8NgdDNlIDoZZwfG5cnzzlRwDAZ9+MHj5vx+aT/kFpnDd0aZUCj+fTFLwg8HxiyGoD1qq5m1gc/4bdDJI+afh8vo+Pz+TJk1FDGjlypJeXF5pqnc2vhlZkCNCK6gVaETYM1FYhURIY4qjMUs8w4oWg/EfPaVmUcv2SdKZAKauKi49fsGLzV9/91OV7Kys7dyfvmKIyhbT1vfRrtLqLTwoKSz8+YsQRylyDCkTVGCd4tipEItGVK1f086CnTZsWEhLCKMPplGcEWlFtoBVh49O1okqp6iWRfyeBeiW80COsMPAFnVRa0QxLSb7MJh+5HDhs9pavxy8fO3+70yU/SjHd1DvFM+mFgmuRJEO+GZrOfPScZmI5LQc2m33kyBH9CrPzF/zx4vlzc4v6MNCKaoBWhI1Py4oUKk2ZSPaCwPOKIF0IzL+TQI3NYjdDoLBMqRXKkPB05l7PuAmL/2n7zcSegyeu37g5NTnR1LvGPwqVxj2USGB8vGEklihdgwoYPFN1mbZI8vLybG1t0SQd3bp1s7e3p9Nx9+oDragGaEXYwLMVIQjC4VYgCKJQaQro4rB05rUosmtQwe0E6uui8vJKRX3TKo2FTKnJLhbG5fJvP2WuOXRryPQVAHQGoP3MX6aHhwRp1DBn9ltSCLzrUWRDLkdyPtcnpqgZJLUkdDrd06dPFy5cqE9n5+fnh6vJIdCKaoBWhA08W5FUoY7NoN+Ko3iEEW9Ekx8klTRPYgKlSpNPF917WnwtqiggheMTnrViw85On3UEAAwbOvimj7dcZsKBqE8RmVLjHkIsMCB/q0qtdQ8l5BoQdAepg06ne/jw4Y8//oga0rp167Ctq2sKoBXVAK0IG3izIrVGWyqQpBJ5fvHUc4/zXB7nxr9hF7ErmyE5m6BSkU0VPn5BuxCY7xNblFIoKuFWR0RGTZ86EQDQpk2b7du31w6uhdQmhcDzjiEb0kzNo4kuhRAMCbqDvE95ebmjo2P79u0BAMOGDQsMDDS3IgSBVvQuMB0qRnCSCYLMqgzLKPWNo7iHEm/GFqUVCsQSJZ1l8tfnSqnqBYF3/1mxVxTJK5KUlFcmrFYhCFJdKT6wz7Fjh/YAgEGDBj169MjUSj5p1Bqd65MCMqvyo9/U6pCbsZSnuZxmUNVSefLkyZgxY9DmkZ2dHZPJNK8eXL3OvrUitUZrlg1NyadQqc0loEFtWhrOtSmbT5ve9jRabbVMVUAX+z8rvhCYfzmU6P+sOK2QV/FfvK9Wq6OzRErjadPvWqXWiqoVaYX8a5GkS8EFt+KK4t+wSgU1w+lJz55Nnz4dfdRXr15NIhkUIdbKSSPxvQwLpSspq3Z9UiCWwME27LBYrB07drRp0wYA8MMPPwQFBaGfm6UaoZUK5Qrz12/oGfgvHSpLZJaNpk+HaiYBDWoT4V1bqYm16bORCquYHPHLPNaDBPLVsIIzAbkXgwoePKUkZzMLqDwuv5InqCwtExtTG1tEZ4tYXLFAWMXkiJKzmf4J5MvB+ecf51+LKIx4WfKKyKGzRYLyKjavgiuUURl8e4cDnTt3BgD069fP29tbrW5904UwIVVoLocSC+gGTX8JSKYFp8LezqYSGBg4dOhQAEC7du02bd5OKGLxRHI6u7mrEQKFW2LqOsSADT0ncKyoXuBYEQqdVx2WzvSOJnuGF16PJiflcQUN5oIzojZ2uTQio/RmXNHVCNLdRGomWSD/UBIgBoOxfPlytDG0cuVKAoHQ9F23KpLzud4xRWoDhozEEuX5x3lckRGSAbZyKBTK+vXr0Zt27ty5ZmnB0+FYkR5oRdgwtRWJJUpSaUXwS4ZbCME9lBiUSn9DLRdUGjTlvonapAo1ky+JzWK7hxI9wwtD0xjZxcJKab0rlT179mz8+PEAgM6dO7u6usLGEAaUau3FYIIhyRcQBEnM5vjGUUwtqTWg1Wq9vb0tLS0BAEOGDImJiW5mAdCKaoBWhA0TWRGvQv6CwAt4XnI5jOj6pCAys7Sk8cvzYNOm0ery6eKwDKZ3DPnik4Lglwwqp+qju/bz80Nz9Q8ePDg8PLxRe4TUJpXIuxFjUJBxtVzlFkIwsEMP8lGSkpJGjRqFzoT18vJqzl1DK6oBWhE2jGhFGq2uTCiNec26FknyCCfeTqDGvWGzy6XNo02p1pJZlf5JJZdDiT6xRSEvGSSWQe/mCIK4uLh07NgRADBv3ryiIjgBs0ko1dpLwQSSYQ2jTLLAK4IEA7uNBZ1OX7ZsGTr34PTp07r6FjQ0+n6hFemBVoSNpltRhVRZyKyIfs3yCCOee5z3OIWeRSnnGiMbqSHahFWK3BJR8EvGhcCCKxGFCdlsKqfK8ElIKpXqwIEDaD/7xo0bKys/HosM+SgpBN61KLIh1aBOh1yLIr0k8kwvqrWgUCh2796N3tL29vYqVb090kYEWtE7sHC8PiYbr9owW1GlVJlK5N1/VuwVSbocRgxMoVM4VcZNhdCANqlCnUrg+T8ruRpBuhJRGP2axRPLG5sHSCKRbN68GX1od+/eLYM5FIyERK52DyESDEi+gCAIhV3pEkSQKuDInNHQ6XQnT55Eb2wbGxux2ORdoK3dihQKRfV/VFVVEcilFZWV1fijqqqaSC5VKPE4i6KxnWBckTyFwPOKJLkGFdxNpMa9YRebLBspqk0/GUir1YklyldFAp8Ysltwwd3E4qc5ZZiXI5LJZBs3bgQAWFhYODk5Nc/LY+shOZ97M7bIwJeD+8+KwzNKTS2ptXH58mU0ierq1atN3dxv1VaUnJw8YcKEnj179viP7l9b9sArlpY95s2bR6HgLl7IECuSKTUFdHFsFutGNPl8YP69Z8VZlHJ+hVxr+p5ovqASQRCmQPKigHs3kXohsOBmbNFrioAnbtLeZTKZjY0NOhvDw8PDeHohb1FptC5BBRS2QTUgu1zqFkzgimGr1Mj4+Pigg6Br1qyRSEyYEL1VW9HWrVvBp4a/v38zn6WP0oAVSeTqN1ThvafFV8ILr0eSH7+g55Y065LGPLHcP7HoSkTh9SiyXzzlZSHfKCtSq1QqW1tbAH3IxLwk8q5HG5qvMzyjNCCZZko5rRQfH5/PPvsMALB69eqKCkMDeRpLq7YitDZZtWrVy0+BYcOGAQAePHjQzGfpo6BWpPuvI0Wl1nKE0kyy4FYc5eyjvNsJ1PhsdhGrUtVcDqRQaRi86me5ZR5hxItPCnyiCl8VCUTVxuzb3Lt3LwCgTZs2ly9fNmKxkDrIFBr3EKKBoXQSudr1SUEzLD3VCrl+/Xq7du0AAFu3bjVRTF2rtqItW7YAAPbv39/M+8XGpEmTAAABAQHmFvIBePxKjUZLYlVGZpb6xlLcQ4i34ilphXyxRGnqBYFqQ2RWhGUwb8ZR3EIIAcklZFalVKFmso084nrmzBkAgIWFxYULF4xbMuR9kvO4PjGGjhi9KODeiCY3Z7O79XDt2jXUjUxUYdJZIg3erEij1TbDptXp0NinPXv2mPewDQSdxu/v/0Cr0zXPKapv078W6XQ6iUJNYIi9wgkugfk3oskBSSWZJEG1rGYAX6fTabVGFqytVTHJlZrisqqA5BK3JwVekYWBL2jZxUJ9C0yn09FZIqVKY6yd3rp1Cx3I3bt3Lx6Skbd4ZEqNm8FzjFQa7eUwYiZZYGpVrRNnZ2d0mODixYsIghj3uaaVChVKIzynTdzQI23WdKj8CtWqNes/OSvyuHqTL1aaIVEgW8Rgizi8inJhFYMtepnHCkyieIUTzz3OuxRccDu2MOEVg1jC5wn+y0ZqinSKbBGTI+YJKvnlVTnksvCUYp8o4oXH+a5BBfcTihJfM4glfEF5FZdfyeS8/YkRU7UKxMrA4GhLyx4AgM2bNytxGc3YInlewLsZa+isYQKzwj2UCAO7TYSDgwMA4PMuXe/cDyyvUhvx6cZjOlRd8/BfB92nZUUPHgTomu0UvdcpTONWh2Uwr0eTr0YUXo8iJedxRdVKnQ5hldV0gplUgkypTifx7yZSvSIKPcMLw9OZZSJZ7S/pdO8IQBeJUKu1TRfB4/HGjh0LAPjtt99EIriEaPOhUmtdnxRQ2IYOAt2MK0qESxmZhurq6gULFgAAhg8fTqPREeM973SWSKVq6nPadNDDNM9Y0adlRc0/VlQpVVHYlcFpDLdgwpXwwqBURmaRQPxuFADdxJm5RdXK3GKhXwL1QlDBvafFCTkcumETfo2VlEin027caAMA6NevX35+fhNLgzSWFALvRpShoXRsodT5YZ7YqIEqED0lJSVoCNXChQsVCoOyEhsCHYYtQCv6IDyx/CWR9yC5xCOM6B5KjHrNYvAktQeB9JguMzdHKEvO5z5IKrkYXHAjipxG4vMrGpcQwVjafHx8AACdOnV68uRJE4uCYEAiV7uHEgxMvoAgSFAK/fFzmikVtWpiY2O7dOkCADh37pyxyoRWBK2oBp0O4YplMVns61Gka5Gkm7FFsSUemUcAACAASURBVFnsj+aCM7oVCasUCdmca1Gkq5Ekv3hKUl5ZhRTjG65RtJFIpN69e39CwZYtkqe5Zb5xFANfRCokyvOB+QY2nSEYOHXqFADA0tIyIyPDKAVCK4JWhFRIlCRWZcxrlmc48eITwuMX9OxiYZnB2UiNUt0r1Vo6rzo5n3stknQxqODxC1oWVcgTN3VVtKZrk0gkv//+OwBgypQpzZCJC1IfKk3jRowSc+BSRiZELpfPmjULADBz5kyjzHuFVtR6rUgsUaYSeA+SSq5Hk91DiSEvGdSyRmSk1tPE6p7MqgzPYPrEFrmHEu4mUokM8QdXR8VG063oxo0bAICuXbs+f/7cWKog2HhB4Hkbto4RgiBqje5icCP69CCNJTs7G11qD43tbiLQilqXFSnVWn6FPDmvzCem6HIY0S+BGveGQ+M2qR8DQ3UvU2po3OrQNMblMOKNaHJQCv0NVWiKdAxNtCKBQDBy5EgAwL59+4wrDIIBmVLjFkIoMiwrHYIgOSUi9xBCc06ybm1cunQJADBgwICm58aEVtQqrEimUBOZFTFZbO9o8vnA/IDkkjdUIU8sN0oKD8Ore4lcnU8TRWSUeoYVXgohxrxmFZd9fHXU5tH2QdA8+d9//z2TyTSuMAg2kvK43jFFBt63Wp3uehT5eT7XxKJaLwKBYPTo0QAAR0dHXdNqE2hFJrcitVodEhLS9HIwWJFMqcksEjxIKrkeRb4aQXr4nEZkio2eFuWj1b1Src0pEd1/VnwtinQtihT8koF5XQaja2sABoPRr18/AICbm5vRhUGwUS1XG558AUEQKqfq/OP8yg9FfkKMgo+PT9u2bS0tLXNzc5tSDrQi7Fbk5OS0ZMmSlStXLl261MrKauXKlStXrvz9999TU1PRL/D5/MLCwuzs7B07dhw+fJhIJBKJRAaDgS1hjIFWpNJoy0SyDBL/VjzlQmD+7QTq0xxOEavSdCsu11fdl1cq8mgi/2fFLkEFvnGUp7llho85m1qbIaC55saMGSOVYl/RHGJ0nuWV+cYVGX43339WHJ4BG7WmQq1WT58+vemd2NCKsFvRihUr4uLiysrKEhIS5s+fX1ZWVlZW9tdff/n4+CAIotVq582bt3LlynXr1q1bt27hwoVr165du3btyJEjCwoKMOyuYSvS6ZDC0oro16zbCVTXIMKtOMprSnl5paJ5OsoZbBHyX/OcXyFPJfICkks8wgqvRZJSCLzyKkWzpeWuC1YrEolE6Dw+uAYE3lCqtRcC84vLDB3gFFYrzjzMa3o0JqQ+7t+/DwDo2bMnm83GXAgerUir1TXDptMhmzc3yYpsbGyysrLUanV2dvaff/6pVqvVavWxY8f8/PwQBFEqlcuXL3//Vzt27EhOTsawu/8S/7yzSIRcqSlgiO8/K74UQrgRRXr0nJZJFsjeTcCl1ZnqHOp3wWCLyivlz/LKrkeRPMIK7yRSE7I55ZXy5pHRwKbR6GilIpVa09jj8vLyQnMrlJbCtUFxxwsC19vgdYwQBIl5zfKLh4HdpoLP56PRPeiMV2xPOq1UpFQ17jk1XZ321opoLGEzbE1Ph7pmzZo5c+YsW7Zs7ty5/fv3X7Zs2bJly0aMGIFOyFer1QsXLoyKikp+lwULFmCbFIZakfeNm6Jq7ctcVvBz6rUIwpmHuZeeFPgnkOMz6YUlfH55FVfwTjJQY5+3t2lJ2dyKcmFVSanweU5pwNMil0c5Zx7mXo8gPnlOySzgsLhiQXlVaZnYZDIasaFpFg3/PoNdQaXzJ02ZCgA4cOAAtnsDYlKq5epLIQQyy9ARoyqZyvVJgeEjTJDGcvnyZQDA8JGj8gppzLLKZnhOTbShh/PptYrQkbr8/Px169ahHx4/fhxtFWm12l9//XXjxo3b3qV///6vX7/GsLvx48e379brkFtAYDr3cijRJ6YoKa9MWP1OF5zpWh51wmNo3OqIDKZPDNk9hHArjhKXyaiS1l0YAg8bhlaRTqd7/vxFly5dPv/8c/2wHwRvJOZwfOMpWoP7n1MJvKsRhTCw20SQyeRevXq1bdcuJCRUp8NSh+OxVdRsNHGsaM2aNdbW1hs2bLC2tv7uu+82bNiwYcOGMWPGBAUFIQiiUqlWrVr1/q+IRKJAgGU9lfETJrT7avBJn7hXReUVUjNEBMmVmlKBJPo1yz2E6BVJDkqlZ1HK0Wz8HG5FE0M5TQWmsaLDhw8DAGbNmgVXgsAtcqXG9UkBxeA5RmqN9loUOY3ER/+ZUyxkCpopjLM1oNPpli1bBgDYuXMnthLwOFbUbDTdigIDA4lEYmhoqLW1NRog99dff929exf9grW1tRFTxaAddMFBgcYq0EDkKk0+XRT5qvRqBMktuCDkJaOIVVn5ThvI5Jm5MYNBW3l5OXqq4SKtOCcpr8w3ztB1jBAEIZVWuATlK1VaBEFuJ1Azi+AKe8YEDV7o378/h4NlhQ5oRRit6MWLFwcOHECdhkQirVmzBv387Nmzvr6+CIKEhIQ4OzsbMYn6fxF0Dz7+VWOg0WrzaaKA5JKrEaTr0eTgl4z63kBbmBVlZma2bdu2U6dORCLRdMIgTUeu0rgGFRSXNWKGwP2nxTGvWQiC3Hta/Kqo3GTSWiM8Hq9Hjx4AgNjYWAw/h1aExYqkUumePXvu3buH/pNEIu3evRtBkMLCwg0bNvj5+VVWVq5ZsyY9Pd2IaptnkYjyKkUBXfQwmeYSVOAdQ07I5pBZlQ33sLcwK7p58yYAYOzYsSoVnBeJd5LzuD4xH28YlYlkZFYlgiBcsfzikwKOUBaaxsynw/UPjYlarZ43bx4A4NixYxh+Dq0IixVRqVQfHx+N5m3WTp1Oh1ZbBw4cWLduHYlEysnJefz4MbaprPVhUisSVytTCLwHSSVXwklXIkjP8srKRDKVYXdGC7Mi9K7A3OUNaU6qZKpLBiRfKGJXng8suP+sWFStiM/m3EmgPnxOK4QBdcYGTZQ1a9YsDL+FVtQqctB9EK1OVyFRZZAF3jFFHmHE2wnUxBwOV9TomYAtyYq0Wu24ceMAAP7+/iYVBjEWCdkcv3jKRyPjqmSqwFT6haD8sHTmv3ffnPDPoXCaO/dHiycqKgqdjYdh2QhoRa3Rihg8SQqBdzuBej4w/24iNZMs4Aix57ZpSVbE5XItLS3btGljrAXBIKZGqdK6BBWUGJZdnsGrvh1P3XgxZenpZ01MSA95n9zc3G7dunXp0uXNmzeN/S20olZkRexyadQrlk9M0ZXwQr94SgZJIFUYISt2S7Ki5OTkdu3a/e9//2t60ntIs5Gcz70Z24hQuixKuXsokdFcOXlbD2w2+4cffrCwsAgNDW3sb6EVtQQr0mh1D5/TPrjuqkypYZdL47LYHmGFHmGFQSn0V0XlFRJjTpdpSVbk6+sLAJg6dWp5OQyv+mSQyNVuwQRqYzrcdDqdEjcVX4tBLpdbWVlhW0wPWtEnb0Vane7u02KfmKLaj5Zaoy2giyNfld6IJl8MJjxJpZPfnQxkRFqSFZ06dQoAsGTJEuOGnEBMTWI2xzeOosXnPOvWxLp16wAABw8ebOwP8WhFuubh07SiBw8CdP+dIvTzwBS6ZzgRXYVIrdGRWZUBySWe4YU3osmPX9AKSyvqhGIb/URqtTr0NjJ6yU2nkdqQ48ePAwBWr15thgsMaQISufriE4LhyRcgJsLOzg4A4ODgoGtkVUNniVQq89ch6FG8tSI0h6apt6anQ21mUCvyuHqTL1aih1DGqwh6XnzaPzs1lxWXSb8VQzr/OM/tSf7t2ML4THoRXSAQVpXxKhgcEZ1twjNJY4kIFC6tVNg8F8502ngixeatOwAA27ZtM/fVhjSaxJwyv4TGjfDJ5XKZTFZeXs7lcnkfQyAQyGQyuRwuNtEQDg4OAIDVf27gV6ga9aii6VDNXmOgR/HWijRabTNsWp1u8+bNn5wV+fs/0Op0Gq1Wp9OlEHg2F194RZL84iieYcSY16wykbT2ZCCNVtcMZ1Kt0dJKhUqVpnkunOm0abW6Xbt2AQB27NhhxgsNwYZai7iFFDIF74yYKpVKLpdLIpHS0tKio6P9/Py8vb0PHz68b9++zZs3W1tbL1iwYNSoUYMHDx7aIEOGDBkxYsSCBQusra137Nixb98+Z2dnX1/fR48eJSYmvnnzhkajYYhgbnns2bMHAGBruxmtpgzfaKVChdL8dQh6FHCsqCHqjBXxK+T21zKtjsQdu5v9ksgzcDqqiaCzRLgdXGmUtt27dwMA7OzsTCoJYiKe5nIuPn79NCH+5k0fR0fHlStXzpgxY/To0X379u3UqRMwGd27d//uu+8mT548f/78TZs2nT9//tGjR9nZ2WKxWD8RvpWAtoq2bNnS2B/SWSIN3saKmo1P2ooUKi1PLC9giOPfsK9FkVyfFPjFU+Kz2TJlc9/6LSls4ciRIwCA9evXm1QVxFjw+fzc3NywsLDjx4//8ceioSPGjFro0Gvg6DpW0blz52+++Wbo0KE//vjj/PnzbW1tt27deurUKRcXl5s3b8YYQGxsbFhY2MWLF11dXffv329ra2tjYzNt2rRx48YNHDiwe/fu7du3f3+nvXv3njZtmp2d3bVr11JTU2k0Wovv39uxYwcA4K+//mrsD+k4DFtoNj5pK6qDWKLMopTHZrFNFCbXAC3Jis6dOwcAWLlypUlVQZqCXC5PTk52dXXduHHjpEmT6nhAj+Ezx/y+c/ovMzZu3HjkyBFvb+/g4OCUlJSioiKRyPhJ53Q6HYfDycnJSUxMvHv37qVLlxwcHBYvXjxx4sQvv/yyjjkNGDBgwYIF+/fvf/DgAZVKNboYPGBjYwMA2L9/f2N/CK2ohViRGWlJVnTjxg0AwJw5cyQSOP8RR6hUKhaLFRgYuHnz5vHjx3fu3Flfv3fq1Klfv34LFiw4ffp0WGjoy4xX/okkFldoRrUajYbP5xMIhJSUFD8/v7/++mvatGk9evSwsLDQy/72229nzZp19OjRpKQkIy4lY140Gs3ixYsBACdPnmzsb6EVgUOHDjXzfrExefJkaEWNpbHaIiIiLCwshg4dymQyTSoMYiD5+fl3795dtmzZV199pa/Hu3bt+tNPP23ZsuX69etZWVlVVVU4H5JRKpV8Pj8hIeH06dPLly8fNmyY/lgsLCy+//77ffv2JSQkcLlccyttEgKBAK2m9Gu2GU6rtqJNmzYBAEaPHm33KYCuBYLDNJ0tyYoKCwu7du3aqVOnvLw8kwqDNAyXy/Xy8lqxYkXPnj31tfbQoUO3bNly48aNtLQ0mewDuUU+FZhMZmhoqJOT06xZsz777DP9AY4fP97e3j4pKcncAjFCJpP/97//tW/f/vnz5439bau2Int7+w9Ew+CbwMDmXsX1o7QkK5JIJH379gUAREdHm1QY5INIpdKMjIxdu3YNGDAAveHbtGkzYsSIXbt2PXv2rKyszNwCjUxVVVVhYaGnp+e8efN69eqFHnLnzp1/++23W7duMRgMcwtsHOnp6W3atLG0tMTQqdCqrYhAIOzevVvf7Ni+ffva9Zu2bd9uxqZPfWzfbrd2/aaDBw+y2exmPksfpSVZkU6nmz17NgDg3LlzJhUGqYNMJnv48OGCBQv0b12DBg3666+/QkNDpVLsaeM/IchksouLi7W1tT4Qo3fv3g4ODllZWeaWZijomuKjRo3CMLWjVVvR+1TiuNFfhVdtLcmKEAQ5duwYAGDZsmWmUwWpTXV1tZ+f37Rp0/TNoN9++83X17elxpg1jE6ne/ny5ZEjR/r374+ekB49emzevDkzM9Pc0j7Ozp07AaZJRQi0otrodDoaS6TB5VTNt1UqnrW1FCuKiYkBAPTt2xdOnjc1CoXi7t27EyZMQOtcS0tLW1vbFy9efNLjQMaCz+ffvn37559/Rk9Oly5dtm7dmp+fb25d9aJUKtFlJ+/cuYPh59CKaoBWhI0WZkUlJSWWlpZt27aFw0UmJSkpydraWm9Ce/bsefXqlblF4Q6lUnn//v358+fru+xOnTolFJozVL0+srKyOnTo0KFDh4KCAgw/x6MVmSsRHo0lJFC4NJb5U/J9SJsI79pwkMqw6dqYnAoqnf/7gkUAJkU1GTwez9HR8YsvvgAAdOrUaffu3SQSydyicI1EIgkJCZk6dSpqSJMnTw4JCTG3qLocOnQIAPDj1OkFZGYpt7Kxjyoe06GqNVqzbCq1pqRUqFCpzSWgQW1aGs61KVuINo1Wd+vWLQsLi8GDB3M4HPM92i2T1NRUfZU6d+7c+Ph4cyv6ZKiqqnJxcenTpw8AoF27dgcOHMDP3Njq6mq0d87V1VWj1WF4VGmlQrnC/HUIejhmD1vQ0VgirQ4vjcQ60HGuDZedhwgmbVwud9CgQQCAhw8fmkhV68TDw8PS0hIA0KtXr8uXL8MxIQzk5uauXLkS9fLZs2fjJL4uIiKiffv2X3/9dW5ODrYS6Hjq5IdjRfUCx4qwgVkbulrE77//rlAoTCGstSGXy9FTCgCYOXPmJxEPhltUKpWLiwvaw9m/f//w8HDz6tFqtWvXrgUA/PHHHzqsC+nScThWZC6gFWGjRVpRVlYWOr3j5cuXphDWqhAIBH/++SfqQ46OjjA00Sg8e/ZszJgxAICvvvrq/v37ZlSSk5Pz5ZdfNjHSB1pRDdCKsNEirUir1S5duhQAsHbtWlMIaz3weDx04mq7du0uXrxobjktChqN9ttvv6HRH76+vuaSsXfvXgDAr7/+qlarMRcCragGaEXYaJFWhCBIRERE27Ztu3XrlpqaanRhrQS1Wr1+/XoAQLdu3cxYV7ZguFzukiVLAABffPFFZGRk8wsoLCzs3bs3aHJ6TGhFNUArwkZLtaLq6mp0PseSJUta/IpnJuLUqVNoe8jPz8/cWlosQqFwzpw5AICBAwcWFhY25651Ot3GjRvR8b/KysqmFAWtqAZoRdhoqVaEIMjTp0+7dOnSrl27sLAw4wprDURHR6PjbYcPHza3lhZOcXHxyJEjAQDz5s1TKpXNtt+kpKT27du3a9cuIiKiiUVBK6oBWhE2WrAVIQiyefNmAMCkSZPgYHujqKqqmjJlCgBg8eLFMAqxGUhISEDXjb1+/Xrz7FEqlc6YMQPtNmj6XA5oRTVAK8JGy7aiwsLCfv36wVf7xuLu7o4OYJgrbZpGoxGJRLx3EYvF+kpTp9OpVKrGlonnNfr2798PABgwYACNRmuG3Tk7OwMAunfvbpS5TdCKaoBWhI2WbUUIgnh7e7dp0+aLL774dNc0a2aEQiE6R/j48ePm0nD27NnZs2cvf5eZM2d6e3ujX+ByuTt37kQQ5MWLF6G14PP59ZXp5+en/zmCIDKZzNra2tnZOSwsLCIi4tmzZ0VFRaY+rgbgcDjo+rDOzs6m3ld6ejo6W/n8+fNGKRBaUW10tJaVNaDZoLNEWlxaEWIMbSqVavWqVWjurwbqKYiegIAACwuLvn370ul0c2nYtWvX+wMYt27dOnbsGPo3h8NZunQpgiAeHh4OtSCTyegX3N3dDx48eOjQIX2qaXd3dxcXF/TvioqKs2fP7t27d+/evQcPHty5c+e3336bmJjYHMdWP66urgCAsWPHmjTQRiwWz5w5E0330MRoBT10lkiDNyuis0Xm2fTpUM0loCFtIqjNXNo4fElSSlbfb/sDANatW4d5PnkrQafTrVu3DgCwefNmM54rR0fHq1evkt7F2dn59OnTCILExcUtXLiwb9++GzZsqK+bLjU19dGjR35+fvPmzXv06NHKlSvHjx8/duzYgwcPIgiyd+/efv36HT169MiRI3Z2dra2trNnz3ZwcFi/fr0Z4y0JBEKXLl0sLCySk5NNtxcHBwcAQPfuXwdHxHPLZUZ5VN+mLTZ3jYEe4FsrUqk1ZtmUKnVxqVCuVJlLQIPaNCU416ZosdrQfoOQkJDOnTsbsUeipVJWVjZq1CgLC4smTjRpIgcOHJg5c+bad5k6daqrqyuCIBKJpLCwcO3atfHx8VevXr158+aDBw/8/Pxu3rx59+5dlUql0+nQIZD09PQTJ06oVCo+n3/y5Ml///2Xx+MhCJKdnT1s2DAnJ6czZ87MmDHj119/PX/+vJOT06BBg8y4iINCofj9999N2kd38+bNtm3btmvX7ubNmwiCqNVaozyqJaVCmdz8dQh6jPjooMNzylE8a8Nz56GRtJ05cwadrRkVFWWUAlsk6JzHzz///PXr12aUsWfPnvfH9gIDA52cnNC/L126NGrUqIMHD54+ffrs2bMjRoywtbV1dnb29PRUKpU6ne7ChQuPHz/eunUrl8sNDw9nMpm3bt1yd3fXl3b//v3z589v3LhxypQply9fRrvvbt68ad5nAW2ybN++3RSFv3jx4uuvvwYA2NvbG/cwcTXeDMMW6gWGLWDDuNrUajWaS61Pnz4wN119pKend+jQoXfv3gwGw4wy/vnnH2dn5+R3OXDgwJkzZxAEKS0tnTZt2qRJk27cuJGcnHz9+vVjx44FBgbWSeZ29OhRe3t7tVpdUlKybdu2kydPXr58Gf1f+fn5BQUFvr6+hw4dOnnyJJqS4+rVq8XFxc1/sLVxcXFBM5MavWQCgTB48GAAgJWVVVVVlXELh2ELNUArwkbrsSIEQcrKytC5FMOGDdOPb0Nq8/TpUzRjtEgkMqOM/fv3W1lZbXuXmTNnonEHcXFxDx482Lx5M4Ig165du3Pnzt9//02lUvfv369fGUQgEJw8eXLIkCFoj9ydO3dOnz6tbxW5u7s7ODgcOXLk5MmTTk5OP//88/r16yMjI80+lOjp6YnOdTVusaWlpZMnTwYAjBs3zhTB4tCKaoBWhI1WZUUIglAolNGjR6PzXs3+CoxDXr9+3blz5x49epj35OzZsyc9Pb3Oh2FhYSdOnED/FgqFq1evrqqqWrRoEYIgW7duzc3NJZPJW7duRb0nLCxsz549OTk5jo6O6E+uXLlSO6PrkSNHjh49euzYsTNnzsyfP3/nzp14WODq+PHjAIDVq1cbsczy8nI0p+2QIUPy8vKMWLIeaEU1QCvCRmuzIgRB0tLS/ve//wEAfv75ZyaTadzCP3WKior69u372WefvXjxwowy/vnnn3379j16Fzs7O7SDDkEQFotla2t77949dEjJzs4uLS0NQZCjR49yudzXr187OjoKhUKFQoGGzCEI4uvrqw/mfvr0qZOT065du+zt7REEsbW1pVAonp6eJ0+eNO+B29nZAQD++ecfYxUoEonQLPWWlpami1aHVlQDtCJstEIrQhAkOjr6m2++AQD89NNPJSUlRi//06WysvKnn34CALi5uZlRhoODw+LFiw++i5WVld6KSktLFy9ejCCIVCp1dHQcOnRo7ff9kJCQOmNd7u7uv/zyi6enJ/pPX1/fEydOvHr1SigU7tu378SJE2iH5MWLF2/fvt1MB/keYrF44sSJAAAvLy+jFFhaWmplZQUA+Prrr4ODg41S5geBVlQDtCJstE4rQhAkOjoazQn0008/EYlEU+ziEwXNQPN///d/zZmasw40Gu39JD0ymUzfilUqlWhyBJlMFhYW9vTp04bVPn/+PC4uTiAQ1PlcIpGEhoZWV1cbTzt2kpOTLSwsunTpYpS8D0wmE835/eWXXwYGBja9wAaAVlQDtCJstForQhAkJSXl22+/BQCMGjXq/ZGJVktqamrHjh27desGz0kzs2XLFgCAtbV10yOtCQTCjz/+iPpQUFCQUeQ1ALSiGqAVYaM1WxGCIJmZmT/88AMAoG/fvjExMabb0SeERqNB4wz//PNP3E44a3lkZmZ269YNABAQENDEopKTk9Esgn369AkNDTWKvIaBVlQDtCJstHIrQhCESCROnz4dfX+Ea5WiREREtG/fvk2bNs1TkUG0Wq21tTW6sHcTJ/34+/v37NkTzWXXbEsYQyt6BxpLpDX3tID6oONcm7ZVa+Nw2AsXLgQAAAAOHDiAk5EDM6JfSvyHH34wY1LU1sOlS5cAAJ999llCQgLmQhQKxYkTJ9q1awcAmDlzBpVCMaLChqGzRBoNXuoQc6dDZYsIVLym9WSLiFAbXrUx2KKycimRwlq7wRZ1I2trayqVat7HyewQicSBAwcCABYtWgS92aTExsZ26dIFALBr1y7MhZSVla1duxa9gf9YujKnoIQnlDFa0HNqyIaeirdWpFSpzbIplOpiplCmUJlLQMPaSnCuTd7KtWkQBNFqddeuXfviiy8AACNGjDBp8OsnQXh4OJpDdufOnWaMpmvZZGVlofl45s6dKxaLsRWSlJSEBil8/vnnZ8+eRRODKlWaZntUS5hCqcz8dQh6NmAHXUPADjpsNL+2xMTE4cOHAwDatGmzb9++98N/WxUeHh7oi/aOHTskEom55bQ0UlJSUB8aOXIktnw8FRUVx44dQxtVgwcPfn+Rp+YBjx105gKGLWADhi28D51Ot7GxQavgyZMnx8bGNrMAXHH69Ok2bdoAAGxsbMybmK6FERYW1rt3bzS+4M2bNxhKSEtLQxfBAwCsWbOG0oyDQ3WAYQs1QCvCBrSi+rh79y76xtqxY8d9+/aVl5ebRQYe8PT07NixIwBg1qxZ5l08omUgl8svXLiAhm5PmjSJQCA0tgSpVHr+/Pnu3bsDAHr37u3u7q5Wq00h1UCgFdUArQgb0IoaoKioaNmyZehb588//5ySkmIuJWbn9u3b6FI3vXr1MlZamtYJkUhcvHgxelMtWLCAxWI1toSMjIz58+frQ2xycnJMobNRQCuqAVoRNsxe3TcAHrQplUovLy80Yd0XX3xx6tQpLpdrRj1mJC0t7eeff0ZrwBUrVmDrU2rNVFdXX716dcCAAWh8wYkTJxq7eLlIJHJxcUEbQ927d7906ZJCoTCR2kYBragGaEXYwEN1Xx/40ZaTk6N/k50wzGBmOwAADyNJREFUYQK6arW5RZkBoVDo6OiIDh1179792LFjrdaYG0tCQgKamRRdNAjDAGRQUNAvv/yCljBz5kxctdGhFdUArQgb+Knu3wdX2hQKxZUrV9BXWnQpzNjY2NaZFycuLk5fJ44ePfrKlSsVFRXmFoVTdDpdTk6OnZ0dGhbfpUuXffv2cTicRhXy8uXLP/74Az3hPXv2PH36NN5OOLSiGqAVYQNX1X0dcKiNRqPZ29ujPSRt2rTZuHFjdna2uUWZAalUeunSJb0xjxgx4tKlS3C5jTqkpaXZ2tp+/vnn6FlauHBhY5syBAJh165dnTp1AgB06tR569athYWFJlLbFKAV1QCtCBs4rO714FZbeno6mhcHXQnG0dGxdWbHIZFI+/fv79WrF3oqhg4dun//fjyMopsXqVQaEBCwatWqzz77DD0zc+bMefjwYaOC3Hg83qlTp/r06YOWsGTJkkdPIk2nuYlAK6oBWhE2cFvdI/jWptFobt979MuMGWhNMWDAAFdXVwzRUC2AkpKSI0eOoIs/od68dOnS6Ojo1hb+rtFoSCTSqVOnxowZg56Ktm3bzpkz58mTJ43KcFpeXu7r64smjAcATJs2LTAwUKFQlFeq8ToTHVrRu9BZIh2C02vFwLk2vN7jeNZWXqGSyeTe3t6jR49Ca41BgwadPn26dS7EV1JS4uTkNHXqVPAfEydOdHJyioqKamKqafxTVFR0586ddevWoVkP0JiONWvWPHnypFGjiUwm08PDA13IFQAwYsRwD4/LUqkU/b8MDn6zojBYIi3esi0w2CJzbQQql26+vTe8EXGujWV+GZ+iNhavqkKqS39NtHc81KdPX7QG+fbbb3ft2lV7fevWg1AoDAsLW7t2LTp/E2Xy5Mn29vYxMTFisbjFBHoolUoajebj47NixQr9mBkA4Pvvvz937lxjRxBpNNrRo0e///57tJBevXr/Zb8vJSOvUoaw+dVMjpjxNuWo+W/7+p4FPGhDT+ZbK5Ir1ebZFKpiplAqV5pNQEPa1HjXJoPaGr2h2hTKtwMALBb73Llzo0a9bSF17drV1tY2NTX1/YWxWzwajaaoqMjV1XXu3LmWlpb63qr//e9/S5YsuXbtWmZm5qcYBS6RSEgkUmRk5KFDh6ZPn45mztUHbtjY2ISEhDQ2penr168dHBzQFYbQck6dOsVgMND/q6h9v5UKJTh+FiRS82tDT5r5O+hgOlRswHSo2PigNpFIdP369Rn/jSG1bdt22bJlQUFBLaY10FiysrLc3d2tra1rV9wAgHHjxq1fv/7MmTMhISFkMtncMuuloqIiNTXV29t7z549c+bM0cdooIwaNWr37t1BQUEY0uYmJiba2NigQd4AgClTply5coXP59f3fTpbpMHxswDTob4Fhi1gA8+hAXjWhiANaROLxcHBwfPmzevQoQMAwMLC4pdffvHw8GAwGDq8vpGYFLlcTiQSg4ODd+/ePXHixNrddwCAb775ZuLEiTY2Nk5OTo8fPy4oKOByuRKJpJnzqikUCrFYTKfTk5OTr1279s8//1hZWY0YMUI/AoReym+++cba2trd3T09Pb2xM4QQBCkrK7t3797//d//oSbUpk2bmTNn3r9/vwETQqGzRWocPwswbOEt0IqwgefqHs/akAatCEWr1cbHx69atUo/s6RHjx6bN28ODQ1tbdFltVGr1QUFBbdu3XJwcPj999+HDBmCpm+oXd336tXr119/XbVqlaOj4/nz5/39/aOiotLS0shkMoVCYbFYcrlcP55vOHK5XCKR0Gg0KpWak5OTlJT06NGjGzduHDt2bOvWrQsXLhw1ahT69lCbL7/88scff1y5cuXx48fDw8P5fD6G94nq6urY2Fh7e3t9qGG7du0WL14cHBxs4FpQ0IoMBFpRvUArwgaetSEGWJGelJSUo0ePDh06tPZI/uHDh1vn9Ng60Gi0Z8+e3b59++DBg6tWrRo3bpzeuevQsWPHvn37DhgwYMSIETNnzpwxY8aiRYs2Gswff/wxc+bM6dOnDx48eODAgeg85Q/Sp0+fGTNmbNq06dy5cw8fPnz16lVlZSXmAywsLDx16pQ+PwUAoF+/fnv37n369GmjyoFWZCDQiuoFWhE28KwNaYwVofB4vJCQkOXLl6PJVdHX7fnz59+5c0c/TN3KUalUQqGQTqdnZGTcunXrzJkzO3fuXLZs2eTJk4cNG9anT59u3bq1a9fOwsKiPhcxhHbt2rVv397S0rJfv36jR4+eOXPmunXr9u/ff/HixeDgYAKBwGazq6qqmtiVymQyHz58uGjRIn3ghqWl5YIFCx48eIChWw+BVmQw0IrqBVoRNvCsDWm8FekpLCy8cOHCrFmz9JXjgAED/v7773v37lGpVKPrbBnIZDImk5mVlRUfHx8dHe3r63vt2rUzZ844Gsa+ffs8PDy8vLwCAgISEhISExMLCwtLS0uNrpPJZAYEBOzevXvgwIH66/vTTz85OTk1MZc5tCIDgVZUL9CKsIFnbUgTrAiluro6KSlp3759/fv319dZAwcOXLp0qZeXF4VCMXAIAWJ2VCoVg8Hw8fFZvXp17W7Ynj17bt++PTY21ihDg9CKDARaUb1AK8IGnrUhTbYiPQKBwN/ff+3atSNHjtTXYp9//vns2bNdXV1TUlJac4wDnpHJZK9evbpy5crvv//+5Zdf6q/dd999t2zZMh8fH+MmgoJWZCDQiuoFWhE28KwNMZ4V6eHxeI8fP963b9+ECRNqj21MnTp1//79QUFBpuhQgjSWioqK2NjYf//9d968eeg66yjDhw/fvXu3v7+/iTKUQysyEGhF9QKtCBt41oaYwIr08Pn8tLS006dP/fTTT7Vft/v37z9nzpzDhw9HRkYymUyJRGKKvUPqIJfLWSxWUlLSmTNnrK2thwwZ0q5dO/SKdO3adeLEicePH09OTsYWjGA40IoMxPzZFuhsHKccxbk2vM67hNry8/NcXV2WLV06cOCA2k2lr776CrWlwMDA3NxcOLBkXDQaDZFIDAkJOXny5MKFC3v37l375H/7bb+FCxecOeP85k2WTtdMVTCDg9+MLQw2jrKivLUiJkdslo3BERGpXAZbZC4BDWoTQ20tTBvT9NpKuRVsXhVfJK+U6soEkvikdC/ve/b/HPp1tlXPnu+kn+nZs+evv/76119/3b59OycnRyKRtMLEd01Eq9XKZLKCgoLbt2/v3r179uzZ+rWC/vP+7j/PmLXb4ZCXz73Yp2kMjrhSpuOL5Wx+VSm3onnuNzqOnwU8aEMv5VsrkilUZtmkciWVWS6RKc0loEFtqmKca5NCbY3emlObUlXz6i2RyrhcblJSkrOz86JFi4YNG1Z7xOLzzz/v16/fb7/9tm/fPj8/v7S0tJKSErytP40HqqqqaDRaWlravXv3Dhw4MGvWrAEDBnTt2lV/Jtu0aTN48OC5c+ceP3782bNnHE5ZtaQmv4NKrWv++60ax89CtcT82tBLY/4OOhoLx505ONeGm8Z1HaC2jyIUChMTE11cXDZu3Dhx4sT3UxX069dv5syZdnZ2bm5uT548yc/Pl8lk5lZtBpRKZX5+fmhoqLu7+44dO1DvqXOuOnToOHr06DVr1jg7O0dGRvJ4PHOrroGB43SoDJgOVQ8MW8AGnkMD8KwNMWXYAmb4fH5eXl5MTMxxpzMbNmyYMmWKpaVlnQxvPXr0GDt27KxZszZs2HD8+HEfH5+4uLji4uLy8vLq6mqVSmXug2gSarW6urpaIBDQaLT4+HhfX98TJ07Y2NjMnj17woQJ+rUYUCwsLLp37z5q1KgNGzacP38+LCwsNjG1lMU290F8GBi2YCDQiuoFWhE28KwNwaUV6Skrl2o0WoVCwefzExMTr169amdnN3v27OHDh+tXJXi3NdChd+/eU6ZMWbp0qaOj46VLl4KDg58/f56RkVFYWMhgMLhcrkqlwsMQlE6nU6lUAoGAwWCQSKTMzMykpKTg4ODLly87ODgsX758ypQpvXr1ej+rKQCgU6dOgwYN+u2332xtbV1cXOLi4thstlwu1xcuqMCvE0MrMhBoRfUCrQgbeNaG4NuKGBzxB7tLOBzOy5cvHz586OnpefDgwbVr1/7222/Dhg37YMWtt6ihQ4eOHTt27ty58+fPt7GxsbOzO3z4sJubm6enZ2hoaGRk5Js3b6hUalEtyGRyowaoKioqav+cQqEUFRUlJydHRETcu3fPzc3t9OnTO3bs2L59+8KFC62srCZMmDBs2LBvvvmm9jhZbdq0afPdd9/98ssvq1ev/ueff9zd3f39/VNSUhqe9ENn4bi6h1ZkGNCK6gVaETbwrA3BtxUZWG1pNJqqqqqysrKioqLMzMzHjx+7urru2rVr0aJFY8aM6du3b48ePbp27dpw+lELC4tu3br1eBdLS8uBAwcON4zvv/++X79+75dQn0Hq+fzzz3v06NGnT5/hw4dbWVnZ2dk5Ozv7+/u/fPmSRCJxOJyKiopGLXoErQgb0IpqgFaEDTxX93jWhrQIK2oYHo9XVFT05s2b6OjokJAQLy+vixcvHjhwwM7Obv369fPmzZs1a9bw4cOHDBny1VdftW/fvkMt6mus1EeHd2nfvn2XLl0GDx48bNiwGTNmzJs3b/Xq1XZ2do6Oji4uLpcvXw4MDIyMjMzMzKRQKEacWwqtCBvQimqAVoQNPFf3eNaGtAIrahiVSiWXy0tLS+l0em5ublpaWnotMjIy4uLigj/EjZv3AoOe1P4kOjo6MzOz9s/T0tKysrLodDqDwZBKpc0WTAGtCBvQimqAVoQNPFf3eNaGtHorwkyFBC9Rv+8DrQgb0IpqgFaEDTxX93jWhkArwgquq3s8a8P5NYVWhAKtCBt4ru7xrA2BVoQVXFf3eNaG82sKrUgPnS1G8JtyFN/acJsJAmrDBIMjxm92DzbUhgW8X1PcZIL4Lx1qmdg8G5qekiMym4BPWhsbamv0BrVBbVAbrrS9Y0VSmdIsm0SqpDLKq6QKcwn4tLVJoLZGb7jWxsSxNjyfNzxrw/k1rTa/tnesyIzQWTheEwjn2nDTuK4D1IYNBgdH68fUgcGC2rCA92sK06GiwLAFbOA5NADP2hAYtoAVXIcG4Fkbzq8pDFuAQCAQCAQFWhEEAoFAzMz/A7Gu277kohYEAAAAAElFTkSuQmCCAA==" alt="" width="443" height="196" />

动态代理,

1)代理对象,不需要实现接口;

2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;);

3)  动态代理也称 JDK代理和接口代理;

JDK中生成代理对象的API:

|-- Proxy

static Object newProxyInstance(

ClassLoader loader,       指定当前目标对象使用类加载器

Class<?>[] interfaces,     目标对象实现的接口的类型

InvocationHandler h       事件处理器

)

代码示例:

1、目标对象须实现的接口
package org.fkjava.b_dynamic;
public interface IUserDao {

    void save();
}
2、目标对象,实现接口
package org.fkjava.b_dynamic;
public class UserDaoImpl implements IUserDao{ @Override
public void save() {
System.out.println("-----已保存数据-----");
} }
3、使用代理工厂,生产代理对象
package org.fkjava.b_dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 这是一个代理工厂,用来生产代理对象
* 给所有的dao创建代理对象[动态代理]
* 代理对象不需要实现接口
*/
public class ProxyFactory { //通过构造器维护一个目标对象,这里用Object,表示可以给所有的目标对象生产代理对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
} // 给目标对象,生成代理对象
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(), //当前目标对象使用类加载器
target.getClass().getInterfaces(), //目标对象要实现的接口的类型
new InvocationHandler() { //事件处理器 @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { System.out.println("开启事务"); //执行目标对象方法
Object returnValue = method.invoke(target, args); System.out.println("提交事务"); return returnValue;
}
});
}
}
4、测试动态代理类
package org.fkjava.b_dynamic;
public class Test_dynamic {
public static void main(String[] args) {
//目标对象
IUserDao target = new UserDaoImpl();
System.out.println(target.getClass());//【原始的类型 class cn.itcast.b_dynamic.UserDao】 //通过代理工厂给目标对象创建代理对象
//proxy对象是在内存中生成的代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());// class $Proxy0   内存中动态生成的代理对象 //执行方法 [代理对象]
proxy.save();
}
}

  5、输出结果:

    class org.fkjava.b_dynamic.UserDaoImpl
    class com.sun.proxy.$Proxy0
    开启事务
    -----已保存数据-----
    提交事务

动态代理总结:

代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
         (class  $Proxy0 
implements IuserDao)

思考:

有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?

Class  UserDao{}

//
子类的方式

Class
subclass  extends  UserDao{}                                           

以子类的方式实现(cglib代理)

Java 代理模式 (二) 动态代理的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  3. Java代理模式之动态代理

    动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件.代理角色和真实角色的联系在程序运行时确定! Java中有两种动态代理,一种是JDK自带的,另一种的CGL ...

  4. JAVA代理模式与动态代理模式

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...

  5. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  6. java代理模式及动态代理类

     1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  7. 动态代理模式——JDK动态代理

    今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理 ...

  8. 代理模式-jdk动态代理

    IDB package com.bjpowernode.proxy; /** * 代理类和目标类都必须使用同一个接口. */ public interface IDB { int insert(); ...

  9. 代理模式与动态代理之JDK实现和CGlib实现

    静态代理 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 由业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理, ...

  10. Java 中的代理模式及动态代理

    原文:https://blog.csdn.net/briblue/article/details/73928350

随机推荐

  1. unity之加载场景

    游戏中的Loading分为:静态Loading和动态Loading. 简单形象的做个比喻: 静态Loading可能就是一张背景图.而动态的Loading就是在读取的同时有一个东西在“转圈”. 1.静态 ...

  2. Codeforces 976F

    题意略. 思路:为了保证每个点都有至少k条边覆盖,我们可以让二分图的左半边与源点s相连,连容量为indegree[i] - k的边(如果正着想不好想,我们可以想它的反面, 限制它反面的上限,从而保证我 ...

  3. 噩梦(双向BFS)

    给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ...

  4. ElasticSearch专栏

    1.es的分布式架构原理(es是如何实现分布式)? elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的.核心思想就是在多台机器上启动多个es进程实例,组成了一个es ...

  5. BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 +CDQ分治

    1935: [Shoi2007]Tree 园丁的烦恼 参考与学习:https://www.cnblogs.com/mlystdcall/p/6219421.html 题意 在一个二维平面中有n颗树,有 ...

  6. Codeforces 964C Alternating Sum

    Alternating Sum 题意很简单 就是对一个数列求和. 题解:如果不考虑符号 每一项都是前一项的 (b/a)倍, 然后考虑到符号的话, 符号k次一循环, 那么 下一个同一符号的位置 就是 这 ...

  7. CodeM 资格赛 B 可乐 思维

      分析: 我们假设购买一种可乐p瓶,我们可以得到期望:p*(m/n*a[i]+(n-m)/n*b[i]),由这个式子我们可以看出唯一的变量是i,所以可以遍历i找出式子的最大值 #include &l ...

  8. CF991D Bishwock 第十七 贪心

    Bishwock time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  9. ZOJ 3870 Team Formation 位运算 位异或用与运算做的

    For an upcoming programming contest, Edward, the headmaster of Marjar University, is forming a two-m ...

  10. SpringBoot + JPA问题汇总

    实体类有继承父类,但父类没有单独标明注解 异常表现 Caused by: org.hibernate.AnnotationException: No identifier specified for ...