在阎宏博士的《JAVA与模式》一书中开头是这样描述适配器(Adapter)模式的:
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式的用途
用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。
适配器模式的结构
适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。
类适配器模式
类的适配器模式把适配的类的API转换成为目标类的API。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmwAAAEhCAIAAABN2WtdAAAgAElEQVR4nO3dLYzcSBqHcR/LgZMWRodCLAUOXGDpAg/GbGEkk2W30lm6kRYMshYOsRQpJMAgYSujQMMQS4GR0TAHLmgQ6AOvpvymyva4e+y2q+f5gajT47bd1eX621X+CDoAAHCSYOsVAADAV4QoAAAnIkQBADgRIQoAwIkIUQAATkSIAgBwIkIUAIATEaIAAJyIEAUA4ESEKAAAJyJEAQA4ESEKAMCJCFEAAE5EiAIAcCJCFACAEz0cond3dxXgm7u7u/U3HwBP3QMh+vXr1wDw06dPn86zFQF4sh4I0aqqgiB4/fr1DeCPN2/eBEHw/v37s2xEAJ6uWSFKYwS/UG8BnAchigtEvQVwHoQoLhD1FsB5EKJd13Vt2269CufzFL7sE6m3ADb3hEI0SZLB94uiKIpCvxPHcRRFZ1mpYVmWyVqlabr4zN3va4wVkXcuqd4C2LOnEqLzE1TePDa9yrI8cc0ceZ6bVQrDsK7rpeZsXHyOXky9BbBzTyJEj0rQZRdxgiiKTHAeDoelZmu57By9jHq7N9x3BZ5a9dYrlx+ipyVo0zTWOxNDiUVRHNv9687f0CG6qgvO0Quot3vDfVfgtfVuvXLhIXpsglZVlWVZHMdZlpk3D4dDmqZRFKX34jg2f8qyLE3TMAyzLMuyrKoq88G6rtM0raoqz3Mzw6IosiyTflr5SBRF0hts/pSmqfxJr3Ce53Vdl2VpfamqqpIkkTW3eqHTNC3LcqJ3+lJz1Pd6u0MV912Bn9a+9colh+hYDEjeTHzQCrCu6+q61sOTURTpQ8m6rt0j0bZtTdbKyuhxU4lkmaEVvYNHomEYDq5e27Z60WEYmhWL49j0Bk/kqLV0zd8c9bre7hNFCk+tXXUvOUTlQHDwTybABg2GqM4qK+cGQ9SaiRwv6jmMHQIOhqiJRvlSZs76ddd1eZ6PrdJgh/PJRbRzXtfbfaJI4SlC9FFOC4lFQjSKIt0DnCSJFaJjSx/8k2Sw9Ojq1Rubj+kWdrug9WpfZIJ2/tfbHaJI4SlC9LFOiIpFQtQaWLUcFaJWn60VooOdsXmeT5/rdMEJ2l1Evd0bihSeIkQXcGxgPCZETaQVRWGNKeqPHBWi1hlDsnoy3pnnufXVpJfYyt3uxytZLztBu0upt7tCkcJThOgyjoqNOSFq3V0hiiKTaoOTpWmqL/o8KkTLsjRLb9tWumfNguI4Nsmdpqm5FEcmk9dFUZhpLj5Buwuqt/tBkcJThOhimqYZu3eBiTo5cdeQ4JHrWMx/zTR6bk3TZFmmE1TIVStZlplsM++4M7GWbv2pKIqyLGUd8jzXpwfLJTR6KdYMdZfv2M2VDofDxNWrfrmkersTFKnFvdhMky4i90QEnB8hChyNers4itQSRZG+8MzSNI2cWvjIpVzMfu2GCFHgaNTbxVGkljAMwzAcu8a6uz8//5FLOdv9yy4YIQocjXq7OIpUk0vO5CqysWkeH6KHw2GlR1A8KYQocDTq7eIoUi1NUzn93o3JPM/jOJZrzPRf5X35k7wjJ1vIsWaSJHEcmxuwmD8FQSA3VLHOtyiKIo5jud/n4ArocwyfOEIUOBr1dnEUqRZFUdu2RVFYw6JRFCVJUte1/MmEaBRF5oR/yUt5XRRFEARyGn9VVXJ7FvmTzCQIgqIo6rrWg6Pmzi1VVYVhqO99FkWRxG2e5/omoE8ZIQocjXq7OIpUk3Rs21Z3t0pu6WlMiIZhaM6Kl7uJyWu5Kbc5ZJRQNP+t6zoIAqs710puvVDryFgOVZf5wj4jRIGjUW8XR5EaEnXSNxsEgb59mHU1uf5vVVVy0Ys+rVdC1EzTNI1OzcEQlaSs7+lMDcNQjoOFPHtqhQLwDCEKHI16uziK1JABUXmtk3IiRCU7ZfzSPRLVM9eHtoMhKhmc/UiuKZdot/609Lf3DyG6O3EcS2WVMY/py8WwCert4ihSQwZE5bVORElKPZn8Vw4Wzb1TJkLUSs3BEJWnF+t3zMrIiOzgn54yQnR3zPZg9hnjOD7/aeh5nrs3SIKg3i6OIjV0Uuqcs8LSnFikU9P8V246Zo2Jyhm5Zko95mpuySk/hL6LpzlNSeZsVkBuZLZGCfiFEN2XpmnMvp6p39VDT/leg/UkUWjU28VRpEIuDzX7r2maBkEQx7FElwxYShbK3RiSJJGnQSRJIlfFyEiqHM5KiMrFLXKIae2Oy8irdQdBSWu5OXYURdaJu7ICg5ffPE2E6H6NXQct24b7flVVsqW1bet2s+g+HGtu7nnqcmoDITqGers4ilTIOTtmkzRn8ZgJ5PjS3WxlMtnwm6aRFxKih8PBmon7QetNaWQGPyIrwC0aDEJ0v9wQlYe9JEkiu6Lmki9zIp9cVW1ODZC/ys6p7IfK5dVmtnKSujkfz7wpk5lTBM/1jb1BvV0cRboGE6Jbr8glI0T3yw1RPbBvjXZ09+fOyXl95uJrfYa6vDbz1BdoW5egydw4Eh1DvV0cRbq4pmlkhziOY+6KsB5CdL/cEC3LUjaGuq7zPLfOrJMBEmsm+lQCfareYAZbcyNEx1BvF0eRwlOE6H65Idq2rXS9ykOz3RB1ByrKsjT9OXK/TXk/yzI5YcHQpzN0hOgk6u3iKFJ4ihDdrwe7c+eEqJy5J106euDT7b91l06IjqHeLo4ihacI0f2yQnHwQmlzRq47vZBLu+Qe0/p9uQFYpR7RkKapPgHBhKjcCHvJL+Y/6u3iKFJ4ihDdKXnUn7mpdHd/ZbR1AZm+mnMwRGXsUzOJKD3DMiwqjzfSH5QTersfb0IGQb1dHEUKTxGie2ROq4uiSAdYVVXSoxvHsbnfdHd/iYv02Vpn4uk5yJ0crJubyKfcM5JkHeRWmSt+VT9RbxdHkcJThOiFsx4HyIMXFkG9XRxFCk8RoheuLEtzfwbr3CKcjHq7OCnS6+vrCvDK7e0tIXr55E5dW6/F5aDeLu7jx48B4K3r6+uVNg1CFBeIers4KdKXL1/+C/DK1dVVEATv3r1badMgRHGBqLeLo0jhqbWrLiGKC0S9XRxFCk/tIkQ5mwB+WftUgieoIkThp7Wr7gMhytkE8Nd6pxI8QYQoPLVxiFacTQAPrX0qwRNEiMJTuwhRthz4hXq7OIoUniJEgaNRbxdHkcJThCiWVxSF3GswyzJ9I9+LQb1dHEUKTxGiAw6HQ13XdV0f+/SStm33eWOgtm3laS1nkKapLgT31vb7MV0scpunwZ2AfdZbr1Gk8BQhOkBCNEkS89yxB7Vtm6ZpVVV1XcdxfLbEmikMQ+tJZ6eRHYuJWVkJ2nXdIstdyXSxyFPkBv+0z3rrNYoUntp1iM7PsDWYZ20+SJ4aZv5bFMUmaz5x3LzU+tR1HUXR2NzSNNUPQDVv7vPovHuoWKyfVaPFXxxFCk/tN0Tbtt3wWdBt285/ZFgURbrTL8/z8z+DsyzLqqrOsKCxfYuyLOUh3pYsy3YbotMmnkZOi784ihSe2m+Ijh0lyGhl13VWU97c01PKOzK9Gd+S3lp5bebmLn1wBdylZFlmDfulaZpl2YNLadvWeriKDKkWRXE4HLqhR6/IDN03sywLw1CWIp81a1vXdZ7ng7HnrlVd15LEY099qapqbN9i4v1jQzRJEveIdpCsp5m/+43kx3KrypxiGevL7WjxV0CRwlP7DVH3sEa6SeVkEHlApryfZZk5YtDtbxRFWZZVVRWGYZ7n8qLrusPhII/YzPNcGlN3WYPHWzLq2f3YbxmGoXXuSRRFEoQTSzHrrA/gpHGXOJRPhWEoC5LJZJWsWcnESZK4ISqR7IaBmVvbtnoEN03TOI7l2HFw7HNsnLgoirGD72OfAV4URRAEM0O0LEtTRNbqNU2TJIn7e3UPFYvsScRxPDFcSou/OIoUntpXiDZNk2VZlmVpmsrxnA5I3aiZYyY5kce8b9pN0x/rvui6ToLKfMpqT5umcZt+fbgpQ4Nd17ltcdu25p2xpVjDhHoOkvTmK+uoNtMURWGlvvnWLncXoSgK/V2kkOV1HMdm0ZKv1tzCMBw8ehvr450YVpxw1FUxpmTatjVfxKoV5vcy3GIpy9KqSBOjCbT4i6NI4al9hajhHtY0TaPTxf1rnuc60kx/rPuiqqrBRDTcwTCrSTU5FMex1RZnWSZt8dhSrAyzBl8nTglu27Ysy6IorCHYbvJoz5rYHes1IWr9ye3QPqEvdzqKFqF3TfT66FB3f2K3DK39g+kDaFr8xVGk8NROQ3Tw4kLpZAvDUEesHFLIcZjOLdOMui/iONbHbXLUqxfkNqCyUE3mYB1ryjvyp7GlRFFkDrKFzqrBtlu+l6SR9BK7f3U/1Q1FphvSURTJelrnQ7kHl2MBbx326aWf4foWCdGiKMzauh3R1k/sFov1kYkiNRPQ4i+LIoWn9hiiTdNM96SZ6JI0Mn+a2ZfrHpTotHB7ICeOwKy+XN3ROraU6dNV3Lbb6mY8ti/XjUzrVCZdLKYcBk9OHuvLlTOb3PeTJDnD7YrMELJ5R3dQC+sndotF92N3k0UqaPEXR5HCU3sMUfdkTitakiQZDCRp9w+Hw0RfrhVCboPr9uVKD6pePbOGVvCYtBtbih4xFfqEl8G224q9OI6t003NulVVpc8q6oaOJq39gziOzanOJ/flDg58mjv/HSXP82NzNwxDt0ddl6oeVhdusehCnrjHgkGLvziKFJ7aY4i69AX+unU2x0ZlWeZ5LpNJHpRlab0wvawmg60ElXSUKa0glxNu5axO3UCbc2urqtJN+cRSzOmvVVWZLyWLNpep6EWbg6SqquRkVN112d0HgPxVf5eyLOVPOpbKspQ9ErnFkizrcDikaWr2VOS8Kn2GkRSLSdzBH0j/1xr3nSnP8yAIjo3eMAytXQfZm5E3ZaTc/GmsWGSF5a9pmrpnXFto8RdHkcJTfoSoXIxhXaDZ3bfv5k1p4uVCEXMVpn7R3Tf3g/dErX80+Fd33QavRJxYipmVdeaLMbhiZhHuX/W3G5zh4AW1+ruYewXrz5oFmWsxx0qg6zozSNydegwqq3FC9+9gD/NgbekeKhazS/HgQmnxF0eRwlN+hOhS3AFFf5eyN/KVrSP1S0WLvziKFJ56QiEqF59M9El6tBRsixZ/cRQpPPWEQhRYCvV2cVKk19fXFeCV29tbQhQ4DvV2cR8/fgwAb11fX6+0aRCiuEDU28VJkb58+fJfgFeurq6CIHj37t1KmwYhigtEvV0cRQpPrV11CdEnyjx8ZusVWQX1dnEUKTxFiGJh8jAAeV2pG0pcEurt4ijSSyK3l6mq6gw3/twcITpAblsjdx2a/6mqquQhbmNP1tyQe5P909T3D0Y192NyJ7AWdIZ70J9suliyLHMf9iL2WW+9RpFeDP2ox6dwxfyuQ3SwmT6bB+9Cruk77pqnypzZWHEdDoeJp8jNZ20bbjrWde3uduiHfu/KnGIZu10wLf7idlWksjfsPqNpmuxfbrX5T5AbYS54UDgxTFOWpT6KaNv2hDuAno315AlLmqbTj0QUuw7RbQ/p5hSfsO6Oa1Wj8zgcDqs+udN9lLdbPoMHnXKj4PVWbD0Td57aVYt/GQaLdNvdL+vZD9P0PvfedqPluRePP0FBbrgdRdFE++Y2AtYDIXZFHkw5McGDz6Lo9hyi2/anVw89UVJPOfaY63Ma619ditW5re9Qb1ZgsOGQG7sftaydHLlO7LwToosbLNJtOwPnh6jVCAw+SfAMzlNcE+1bURSD50BsUhqL8DtEBytEfk8/y1qefSZ3bTUNvfRgSLeMPB/b9EDKEzplPjK8N/jwNTcSZCZ6Kd1Qh4Asd3opbdvKI7p0H6n8Vx4hIoOLuh2XWcnSzUfkASzyrHLpSrKeApYkyWA90CVpZiVJKUPCSZJMbCrWVjHx/O2xYcUxVVVZz12fIPvF8nPI+uveY+kScA8op4tFvrv7Ha2VJESX5XWIuhvLgw8CWpw8aukMC5oI0bGxmxPGdHZyRpJ/Ido0TXZPokg/DNI836pTuzzWTl+apiZcTT02YxumRPRRvDz5y1oxt+z0w0nMcWrTNO6UZrljS7HOvnH3YU0XqHnypfXASyux3Md/GlVVufGmb+1rjebq2B7MxcFtdWL8eE4t1AafTjpBz1+XqgShvLb2e7oZxZIkyUQLTogubn6Iyg607P/p/Vezl5mmqanDEm/WnnTbtrKPK7OS3Sa3Ag+GaNM0squaZZkJBvOkRf1ZWZnppZjvouuq6TKVXW29mz74HU0v6+CetLwzuBnqkjSzSpIkjmPZZAb3pCdCdGxjd5/pO61pmiAIZp7Yr/ekZW/e2pOWJs7dk5YPuj+xfHc5RdS/EDXKsrS+mxV1Jk0Ph4OuMSZ1TM65L6zcdR+U7T4O02qFTZC459fIgdTEUtyuHr10eSpq59D1yX1suPuUaUNniZlYl63eJKIoMgU72KE9Nkw4tgt8hgfamNLTD/TW+1LdUPC7xZIkif7IRJF2hOgKdJGaPWnJEmEeEGu2d703qZOgU7VCQsh6IVPK/E2Fn35Uu2iaxmwUh8PBVCr3FCQzcDixFN0LpbvWuvsmXradPM9loWPf0ZTGxJGoGwa6GdEbe13X+oQ7t1imj0QH3z9hhOuoM6H0L6V3bnS7LT1VEx80HzGTSVE8uPSdhujgeGQcx/rp3Ia01LKzY6qR2elzX1j1tSgKq3Dd30+OKa2j5G5oaND8aWwpsqNnZmXF8MQ1FeY7Wr/r9ADMg4/LNuFhHZwN7jUPHm4OHsqbpa89wGl2TfRTxN1vbf3E1gRWj8KDY1qE6OJmHolam5VpAa1TKHSImu1x7IWZ0lqc28JaT2cy28h0iA4uxdpqrCpnIl8b+46mKOaHqFvDTctjzccthPOE6FH0zrp16oaezNq37oa+ndWp4HGITpwVKeN/0jTLrqg1aiivTfFNvBDuoKbbwo7VTmvkQ1fNsaWEYTj22Oextlt6V8zKHNWXa0Wm2+9kCtNKTeu4X5+45D4AfPD3Kopi1S1HSC3XK+C2htZP7BaLdcHoRJGaORCiy5rfnTu2Mz24ozk/RN1RcLeFlf7SwZ1ptzt3eil5nsvYv6Hb67HUmdiZPipEzdGtYXamHxOiY5FzhtOVzc60qRjuWNvgzrT7E0/8d9AeQ7QoCutozDpD2pxZYx23zenLtULIDUi3B9LtYjUpaBWxyaGxpbi/qw6kwbbb6mY8ti/X3batJZovq7+j1b2jC0RO49LzHAzRwc6TNUhLpL9U9uMAjPsTDxaL3pYePIAmRBd31IlFMjCpex2zLNOpsF6IDp5q5I4dms+OLSUbukjMGAyqse8ojgpRa1b6KzzySHSwI+0MPVIy5m31UrghOucnnvjvoD2GqEufUtTdH7BbY5ny2zdNI4dNY325MrwvH5GG3vrV3XesVlj/Tro51m33xFL0kag19DtY1fR2K4eqbdtan3JXzPrT4Arr8LMOzvTegOyyiMHzcbqhbhzrJ5tD9jCOvU2ge8MEfQQslcH6yGCxmB21OVdYE6KLmxmien/aGpXUk50Qoqlzr7HB7tzBIyp3uzArNrYUd9/O2hF0g2q6fdfh52561sTu0hfpzh3sfJo4dX9BMlBlbezWt57ZnTvRZz7IjxCVvaSyLK3rkKRQ5LxZOfiTaaS3x3ohTa10vMib2f3ZCt39GW7SgFqde939EIX7G3T37a8+q2ViKd39wLVsS/pEGLNoqxbKkbE5G3DwihrrU/JdZPDVPXI1K6xPCNSntMk+spSArJU2uP1YG0mSJCecoZ7n+Qmnwg8erMi3tmrLRLFIwcqbUjjTewCE6OJO2582FU8PrJjda9n6JkLUGj978MQiKyz1tmDtT5uwn1iKHqap61pXyLEQHfyOeubywm2mBk8s0if8m+1oTohOXEPv5uVRt34TC+5P65nMObFI90RKl/uDBwN+hOhSjr18Ys9L2ZWqqmSbHzzyuzyE6OJmFqkZEZTdShMq0mUib8q/0hTKPpP8Vb+Qq0fM3rm125fdn/EnlzrocJU+G9nrtfYUZcX0+cPdfeQMLsUsSO8Emxt3y16dntXYdzTkaMxaseljA9nXNEvXl7h0zu617IbKmLS1bnol9VLGTpiYJl1ux97naHD/XvaJ3bvITfzEMmAsu9Rz9gCeUIhKFUzT9Nhuxh0uZYekqnl6h79jEaKLO3+RTnRLereUXdGX1LNL/Xj7ClEZ2LuApWBbhOjizlyk0mWy9s7ueZayQ7JLvZP7d67tCYUosBTq7eLOH6Kys7t2iJ5hKdgWIQocjXq7OIoUniJEgaNRbxdHkcJTuwjR6+vrCvDH7e0tLf6yKkIUflq76j4Qop8/fw6wmr/97W9br8Il+/Dhw0qbzRNEiMJTG4do13Vv3769wdJ+//33f/7zn0EQ/P3vf//vf/+79epcoNvb2+/fv6+02TxBhCg8tX2IYg03NzdBEFxfXz979uyXX37ZenWAB1SM7MBPaw/uEKIb+Pr167Nnz/797393XXd9fR0EwZ9//rn1SgFTGNlZG4M7q1pvcIcQ3cCrV6+ePXt2d3fXdd33799fvHjx/Plz+h6xc4zsrMQM7vzjH//43//+t/XqXKBVB3cI0XN7//59EAS3t7fmnaqqgiD47bffNlwrAFu5ubkJguDNmze0Az4iRM/q27dvz58/v7q6st6X7efLly+brBWArejBndevXz979uzr169brxSOQIie1S+//DIYliZc6dQFnhQ9uPPly5dnz569fv1665XCEQjR8/n06dNEd4108/7xxx9nXisAW3EHd3777beAMw29QoieiZxA9OLFi4ljTb1PCuCyDQ7u/PXXX8+fP3/58iWdUr4gRM9ELmX59OnTxDR3d3dmdATAZRsb3Hn79q11eIo9I0TPQYY65txU4Y8//lj1kiYAezA9uHN1dfXTTz99+/btzGuFExCi5zB/k/j+/fvV1dXz58/ZfoBL9eDgjlz29uuvv555xXACQnR1ctOpt2/fzpxebg3z5s2bVdcKwFbmDO68fv2ay968QIiu69u3b8+ePXv16tVRn/r111+DIKiqap2VArCZmYM70nT8/PPP51krnIwQXddpV09///6dM/SAizR/cEfuZMTlLjtHiK7ow4cPQRDc3Nyc8Nk///zz5M8C2KejBndkZ5oba+8cIbqWx1/vJUexDIoAl+GEwZ3H7IjjPAjRtci45s3NzcmPwZPth0ER4DKcNrjz888/P3v2jNP1d4sQXcW3b98WfBLe58+ft/5CAB7l5GPKL1++BEHADXV3ixBdy/v37x98yl0QBP/5z3+mp3n79i0jIoDXHjm4I91a7EzvEyG6pSAIuFMucPEeObgjR7HuIxSxB4TolghR4OItOLjDwegOEaJbIkSBp2Dm4A4jOz4iRLdEiAIQQUBr7CV+ti0RogAEIeopfrYtEaIABCHqKX62Lb169YprqAF0hKi3+NkAYHuEqKf42QBge4Sop/jZAGB7hKin+Nm2VFUVF34B6AhRb/GzbYmzcwEIQtRT/GxbIkQBCELUU/xsWyJEAQhC1FP8bFsiRAEIQtRT/GxbIkQB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" alt="" />
在上图中可以看出,Adaptee类并没有sampleOperation2()方法,而客户端则期待这个方法。为使客户端能够使用Adaptee类,提供一个中间环节,即类Adapter,把Adaptee的API与Target类的API衔接起来。Adapter与Adaptee是继承关系,这决定了这个适配器模式是类的:
模式所涉及的角色有:
● 目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
● 源(Adapee)角色:现在需要适配的接口。
● 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
源代码
public interface Target {
/**
* 这是源类Adaptee也有的方法
*/
public void sampleOperation1();
/**
* 这是源类Adapteee没有的方法
*/
public void sampleOperation2();
}
上面给出的是目标角色的源代码,这个角色是以一个JAVA接口的形式实现的。可以看出,这个接口声明了两个方法:sampleOperation1()和sampleOperation2()。而源角色Adaptee是一个具体类,它有一个sampleOperation1()方法,但是没有sampleOperation2()方法。
public class Adaptee { public void sampleOperation1(){} }
适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。由于Adaptee没有提供sampleOperation2()方法,而目标接口又要求这个方法,因此适配器角色Adapter实现了这个方法。
public class Adapter extends Adaptee implements Target {
/**
* 由于源类Adaptee没有方法sampleOperation2()
* 因此适配器补充上这个方法
*/
@Override
public void sampleOperation2() {
//写相关的代码
} }
对象适配器模式
与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
aaarticlea/png;base64,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5KuEg1Q9ymd/2sjzgXcfQZqLXlQMMkCwbdvTp7YbB+9uzvnewne7Smjc1Fs43gXYCZLu5lzlLfyljbjPVeCK4F2AnSDpbg5RCkcE7wLsBEl3c4hSOCJH9e7d3V0DcCju7++RxLY0eBcOyM7pdgPvfv78OYIX47/+67+uHYST8/PPPz//KQAB78IROZ53x3H88ccfP8LW/POf//zTn/4URdEf/vCH//3f/712cM7J/f39t2/fNnkKYMS7cEwO6V14CaQW9MOHD69evfrb3/527eAAPE5DqxMckJ2bnPBuoHz9+vWHH354+/btOI53d3dRFP373/++dqAAHoFWJzguuzU54d1A+fvf/x5FUdM04zh++/bt9evXP/zwAzWiED60Or0E//jHP16/fh1F0evXr//xj39cOzgnZM8mJ7wbIr/++msURe/fv9ctTdNEUfT3v//9iqECgKvw+++/v3v3TrKFX3/99d27d7///vu1AwVPB++GyLt37169evXlyxe78cOHD/LUXSlQAHAFVLrjOEZRNI4j6j06eDc4/v3vf0dRdHd352zXFl9qmwFuBCvd8cG7I+o9OHg3LJabcj99+hRF0b/+9a/9AwYAO+NIdzTeHVHvkcG7YfGvf/1ruVvdZBU0AJwMX7rj994dUe9hwbsB8fXr11evXsnYoTm+fPny6tWrv/71r7uFCgB2ZlK6o+fdEfUeE7wbEH/7298u6Tn1aJkYAI7LnHTHKe+OqPeA4N1QkEECHz58eHTPb9++vX379ocffvj69esOAQOAPXn//v3cy/ekd8dx/PXXX+2wQwgcvBsKb9++ffXq1YUqlVmBLpE0AJyGOe/CseBXDALpqHx/f3/5If/93/+tE1oBwC2Ad88Bv+L1+fbt2w8//PD69etVA3PlqDdv3jCcF+BGwLvngF/x+shUzE9Y9kBm2Pj48eMLBAoAggPvngN+xSvzzHFB79+/f/XqFZNHAtwCePcc8Ctemffv30vL7tOWjfz555+jKPrzn/987fsAgBcH754DfsVr8vXr161Wjvz8+fO17wYAXha8ew74Fa/Mp0+flleFjKLof/7nf5b3+fHHH+ldBXB68O454FcMnSiKmI0ZAEa8exb4FUMH7wKAgHfPAb9i6OBdABDw7jngVwwdvAsAAt49B/yKoYN3AUDAu+eAXzF08C4ACHj3HPArhs67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" alt="" />
从上图可以看出,Adaptee类并没有sampleOperation2()方法,而客户端则期待这个方法。为使客户端能够使用Adaptee类,需要提供一个包装(Wrapper)类Adapter。这个包装类包装了一个Adaptee的实例,从而此包装类能够把Adaptee的API与Target类的API衔接起来。Adapter与Adaptee是委派关系,这决定了适配器模式是对象的。
源代码
public interface Target {
/**
* 这是源类Adaptee也有的方法
*/
public void sampleOperation1();
/**
* 这是源类Adapteee没有的方法
*/
public void sampleOperation2();
}
public class Adaptee { public void sampleOperation1(){} }
public class Adapter {
private Adaptee adaptee; public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
/**
* 源类Adaptee有方法sampleOperation1
* 因此适配器类直接委派即可
*/
public void sampleOperation1(){
this.adaptee.sampleOperation1();
}
/**
* 源类Adaptee没有方法sampleOperation2
* 因此由适配器类需要补充此方法
*/
public void sampleOperation2(){
//写相关的代码
}
}
类适配器和对象适配器的权衡
● 类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
● 对于类适配器,由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理 Adaptee的子类了。
对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
● 对于类适配器,适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。
对于对象适配器,要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。
● 对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。
对于对象适配器,需要额外的引用来间接得到Adaptee。
建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。
适配器模式的优点
- 更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
- 更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
适配器模式的缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
缺省适配模式
缺省适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。作为适配器模式的一个特例,缺省是适配模式在JAVA语言中有着特殊的应用。
鲁智深的故事
和尚要做什么呢?吃斋、念经、打坐、撞钟、习武等。如果设计一个和尚接口,给出所有的和尚都需要实现的方法,那么这个接口应当如下:
public interface 和尚 {
public void 吃斋();
public void 念经();
public void 打坐();
public void 撞钟();
public void 习武();
public String getName();
}
显然,所有的和尚类都应当实现接口所定义的全部方法,不然就根本通不过JAVA语言编辑器。像下面的鲁智深类就不行。
public class 鲁智深 implements 和尚{
public void 习武(){
拳打镇关西;
大闹五台山;
大闹桃花村;
火烧瓦官寺;
倒拔垂杨柳;
}
public String getName(){
return "鲁智深";
}
}
由于鲁智深只实现了getName()和习武()方法,而没有实现任何其他的方法。因此,它根本就通不过Java语言编译器。鲁智深类只有实现和尚接口的所有的方法才可以通过Java语言编译器,但是这样一来鲁智深就不再是鲁智深了。以史为鉴,可以知天下。研究一下几百年前鲁智深是怎么剃度成和尚的,会对Java编程有很大的启发。不错,当初鲁达剃度,众僧说:“此人形容丑恶、相貌凶顽,不可剃度他",但是长老却说:”此人上应天星、心地刚直。虽然时下凶顽,命中驳杂,久后却得清净。证果非凡,汝等皆不及他。”
原来如此!看来只要这里也应上一个天星的话,问题就解决了!使用面向对象的语言来说,“应”者,实现也;“天星”者,抽象类也。
public abstract class 天星 implements 和尚 {
public void 吃斋(){}
public void 念经(){}
public void 打坐(){}
public void 撞钟(){}
public void 习武(){}
public String getName(){
return null;
}
}
鲁智深类继承抽象类“天星”
public class 鲁智深 extends 和尚{
public void 习武(){
拳打镇关西;
大闹五台山;
大闹桃花村;
火烧瓦官寺;
倒拔垂杨柳;
}
public String getName(){
return "鲁智深";
}
}
这个抽象的天星类便是一个适配器类,鲁智深实际上借助于适配器模式达到了剃度的目的。此适配器类实现了和尚接口所要求的所有方法。但是与通常的适配器模式不同的是,此适配器类给出的所有的方法的实现都是“平庸”的。这种“平庸化”的适配器模式称作缺省适配模式。
在很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有的方法。通常的处理方法是,这个具体类要实现所有的方法,那些有用的方法要有实现,那些没有用的方法也要有空的、平庸的实现。
这些空的方法是一种浪费,有时也是一种混乱。除非看过这些空方法的代码,程序员可能会以为这些方法不是空的。即便他知道其中有一些方法是空的,也不一定知道哪些方法是空的,哪些方法不是空的,除非看过这些方法的源代码或是文档。
缺省适配模式可以很好的处理这一情况。可以设计一个抽象的适配器类实现接口,此抽象类要给接口所要求的每一种方法都提供一个空的方法。就像帮助了鲁智深的“上应天星”一样,此抽象类可以使它的具体子类免于*实现空的方法。
缺省适配模式的结构
缺省适配模式是一种“平庸”化的适配器模式。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWUAAAFiCAIAAACh4l5UAAAgAElEQVR4nO2dL4zkRtrGfWyPHYwOhVgKXHjA0hd4MM0CVzI5diedwUgHFlmBSyytFLLAIGGR0ULDEEuBK6NlXhhgsLA+8Gjeeeetck11T3e7Zub5oW7b7frT9T71/63CEUJIGsXeESCEPBmoF4SQVKgXhJBUqBeEkFSoF4SQVKgXhJBUqBeEkFSoF4SQVKgXhJBUqBeEkFSoF4SQVKgXhJBUqBeEkFSoF4SQVKgXhJBUqBeEkFSoF4SQVDLSi8+fP4+EvGw+f/68tyHGyEUvPn36VBBCiuLjx497m+MmuejFOI5FUfzwww9vCXmpvHnzpiiKDx8+7G2Om+SlFznnFCGXJn8roF4Qkgv5WwH1gpBcyN8KqBe7Mc/zuq7BW8Mw+A9fPkb7ME3T1i0/H543+VsB9WIfpmlqmiZ4q2kaY0Jt2xZFsaNkNE2D2b6qqi7x/rqug9f7vu/7/hIh5kn+VkC92IGjxAJ0XXdUEGc0M4gFPldVdSHZomS4p2AF1Itrc4JYnMCW+Z1AVVXnilUcSkb+VkC9uConiMU0TdM0tW1rLsKE5nmepmlZFn2r67qyLPFDvzmA6/IVb+i6DoMp+KpvVVXV9735lXNuWRb9cOKtYJSEFy4Z+VsB9eJ6nNaygDSYgYNpmsqybJoGllxVlUgGDDuoF4jAsizLshwOB/wEhl2W5TiO6HpUVYXuT0QvpJOCV+lQ2raFuvnjHXVd48mmabbGMl+yZORvBdSL67FlCeM4muaDAUZrLkIR8FlMVN/136NfMo7j4XDQt0TLTIMl2B/R79ehm9fqSIpCRWLoorlxOBy2ZpSeB/lbAfXiqpxWeW7phXxO0Qu/ttfPVFUlg5qGyPgFOkp1XUvodV3roVnd7jBRCg6dXmdwJ1vytwLqxbU5QTLOohdt25Zl2d5H7kZEIXgLMgGD16/aeg+6PCZ001h44WLhnoIVUC924FjJOIte+IMgmqP0wnQ6dOiHw8EkAaKwLMtWBwRQLNxTsALqxT4cJRmP0Yt5nmXUwLxEdxyO0ou2bbVtI3R0Z/q+N0mT5BwOB93l0aFTLED+VkC92I1EyZD5ET3ZITMg+No0TV3XunnfNE3XdWYitu/7w+GAmQ5MlDhvEkTHZF3X4K15nmVGpu97hC72j+EMhKLTOM/z4XAYhgHTtzI/Ms8zxQLkbwXUixwx6ykErRf+V384ILKgQ75CLwT9JPQieMvdX0lhRi7lnVuh6wRGpjz0Yy+B/K2AekFILuRvBdQLQnIhfyugXhCSC/lbAfWCkFzI3wqoF4TkQv5WQL0gJBfytwLqBSG5kL8VUC8uhfGINc/zOI5P0SGlXutxUZ+A8zw/YzelKeRvBdSLiwCPm3rBEnzYxPetZwj2uWN32aXjX5ZlfI/Jsyd/K6BeXISqqnzrqqrqNHvDIu4zRe2IUOq61gu6m6bZWrh9Fi79/vzJ3wqoFxehLMvD4WD2d52sF3qryOXwQ/El74xuQYlP/lZAvTg/0zQdDgd0QPR16MWyLF3X+c5p5nnGLs91XfXGkLqui6LAji99XXaC+i+c57nruq7r/OEAPNx1ndmiEgylqqqqqiL7OyTO+lXw64eXyN45vRXFeRtMxIdocDs/Qgne6vvepOVJk78VUC/OT9u2sFUzhFHd0rataX2g5Y/tpFKrr+uKneNFUWAQAWOoch0tgqqqxNrlVXJciG7h931fliVsuCxLmPRWKM65cRwxphBsFkmc67qWtGBvO7yBHg4HRBLx0SMgENOmaSBGXdfphJtQ4PuraRqdY7JxVhL1iH8sF/K3AurF+RFHlWVZGh8TusTru2VZSjVuXEhM02R0R66j14OvdV0vy7KuqzYeGCE+w/jlPcY4t0JZlgV2btKi3+zuu//Ey8VrhvYMDB3BZ9+jh99f06GYGOpkDsPwPAZK87cC6sX5Ecdz2p6dZw9VVcldqYT9t0X0oiiKYL/G3XrNxbArrutWgHOu73vjOjwYCoBqoAEikdcCYSr/rSYJmkLOua7r/KFNXy/QBpGvpuGjO0rXGeK5NPlbAfXizGDwQnzSmErY6IXYmK7GW++okUj7wo8AdAqeZnT9bFo3/tv8UMzIhX4bonq4RWuf27Ze9B3chrPfoF4EdQfT1QcF+iZbqXsq5G8F1IszY/r/+tzTSPtCLBMd+/T+iLloOh3awv35GjPk6Ydi3o9nkBxT8xsitT0kIKhcKXohTr2eRwfEkL8VUC/OjKk5dbff2IP0wI3fOtMb1+OmcLGH60G9MMMKMvS4ritsTDcZtNEGQzGVNsQIn9Ea0rfM+MWWXhwOBzMUouPjT9+aMU4oLIZCdNyex9Ek+VsB9eKcwKJk0bcMSaIoo0cwDAN6H2IJqLcxLzjPc13XpurGYMGoDhDBfKocYmYigFfB6yciAAlDBGTqxCxO90NBfwpvk/kI/TzmRxAQan7EB8Yc6ZKYGVDxIYoXiuVDF/xQnJrrgdo+j4Ve+VsB9eKcYF5QKkn5ilHJYRgwean7LM45VP593+OW3w9flgW3YC3yEkE/jNUK8h7tWdc5J6H4A6UmFOfcOI4w1K2fSALlJyZiwTrfb1zIe4IB+aFI9LZy7ImSvxVQLwjJhfytgHpBSC7kbwXUC0JyIX8roF4Qkgv5WwH1gpBcyN8KqBeE5EL+VpCXXtzc3IyEvFTevXtHvUji119/LQghRXFzc7O3OW6Si16M41gUxXffffd/hLxUXr9+XRTFzz//vLc5bpKXXuTcEiPk0uRvBdQLQnIhfyugXpB9ENeebdu+8GNHhPytgHqRxBkLNPZinuttZ+S8RhvfXQ53PvI1Z7fjy7JE/Anj3zxX1mVuBY56kYLsN3/ke8ZxhJ0Mw6C9UeXAudIIP+Bt20Y2mBuxcM7llhsa41TRsOXl7DRytgLwNPTi8eX4kTw+AsaLb13XuzTCI1u/z5LJ0AtxPu7TNI1/KKSvIPkQz5Z5ns8odtSLVOI59dS9oczzbDzQXefIMsMwDGPIpfB5Cfr+lggE/8q2bbPVizhN05zR+wb1IpVITuGkYv86+o3B7qXxOuVuz9EZb53Zm5NytJM7/UN8DbqcDYZiIiZXDoeDKVVwt4/Q13VFlILHC5nxDjzZ9z0GCPzREHmtuQjffIizHlyIp3Hr/ZHkRzojWzoihw+kU9d14uHViKc+6slPkR+6HKEUHLyQn5zXjSj1IpVITvlFeZ5nOUGr6zrjJh//8bIs2psu3L0Nw4CjwHCUjrt1liklr65r3f6Ej29/NK7v+6ZpEIpxMCkRk1NIRuX2UoBPOjTd4SEKfuW0DYjnKF0toxzD8uFoU+KPxxCocdiPh+HYzteLYBrFcxeyS3ISbvsQNM438pMW7IzAT5d/3W3ryBZ93xdFkagXcKEshzNpR4SSYygtxgFy0KswfoLqB67Jj4p5HOpFKiantMu5w+FgHM+ZP0muQyzkuqm1tJtZ3WCRMgGHdCZih8PBtG50TOZ51gfqaKuTx8ypxYgnLMT0U4Zh0L4zTeTlMwRIn9bjPwNF04FunW8STGNd18ZVp0RG+/L1JUBniEF73zQ/OcHq0kd/UFXgs+6RmREl37Ohf0iKGag2ufR4qBepbOWUdCI0wWMp/G6zcQ+7NWkn5TvYijal3x+JkCCMZ3ApTHKol4DTVZ3X+5WWvImtSZppBJnIDMMAPTIWFanDTRr9vBK9MLfEk7AQOWN9KwJntzqD6AUqIVz0S4uvF34eGk/FxzaLHoR6kcpWTgULn5zuo8suGtVbjnD9KlSAtfR979d+wVo6WLjHcYQ7fOPtFh6uTeT1GUL6Fpx3u1tX3fpVpt0UjIDEDa1u/24w+X4ag3aCDyYb/ZhsdUbkKACD7jZeCNELXR58zZXMl4iZ1PV9r6MaydKToV6kcpReABQ1KQTxMbN47YruvX/Lrz99X/gSz2DnXDeGgQxSmAKnC2hkFC1YTE07+djOyJY6yNskRDNUZEKJdEa2hlSvMK+Mv8CcVm9Ki68OOMVeXzGD1pEsPRnqRSrBnFrX1RQmc6qFrCl23hk5+q/1S7YmclRXsP7UX6VIoWkj13F0gP+SYRjE9szoplTdfpNEPxYspqb0QwKCLedxHM3Ky+C5x/J5XVdRIpONR3VGgoMU+u9Lx1j+g8igsr5oIuNPb/ujLTqTz7tMS6BepJKYU/pkmvH+mVpt28r4vx6PREt46/gcd/9sdID5FJlQ0HfR6/HnINEfGcdRpi30T2DwZnRQCvGyLGYVE9pNGIQXSUKg/hlFTlV94zhixsd0r1DWcTcljfI2PS+jK1iEInY7zzOuRFZe+c37E9rzXdcVRXGUygS7QiLcyHwziY6BZzPDjQjjLk5yOnvLiHqRSmJOwQbmeTb1J/AX88vyiq3FAu7+MaIAtrT1q60tA5gfDYbiPy/diq3tJHiVmeET/NAntejDv4tQ9NviacTbgjkZjN50Hz85zjl9ENFpLQsXanKeDBIYTLsQPIfNPbQ75mSoF6nkn1Pn5RK93/yR2Z/EpRMvjfytgHqxA03T4KzQZ3BEMDkj+VsB9YKQXMjfCqgXhORC/lZAvSAkF/K3AuoFIbmQvxVQL8g+TLdraruu47gvyN8KqBdkB/T6C6yY2jc+mZC/FVAvHgYLtM/i2xKbxyLrpvfiXGlclgU7L5qmMR4lBH+x1tX8d1ZVlbOv0JytADwNvdh3adNZfDSaVclbtnRptnLyLGmc51kv8caGXfNM0GvO1byZHusGcVmWa/aVqBepxHMqt9r4BMz+JexEuHIc5nm+qKcJs4MTu0JNBIKqlK3/zisXPOpFKpGcWpblXKX8tLri8a0bs3vVneSxUnNC2wQ74rZy4Kg0br1Ee8fwd9m67VbVCd6P+74/tkkyz/NRBSB+KsIloF6kEsmpYKcaLmSwgVJXWXDtCR9Tem9l27ZVVWHnAlx+woDhBRdPYu+2LNPGcEPQR6MOxWyylIjJr4KWg92N8BDZdZ14HtQ2MAwD9miJI0+5CDccaNuL/y7Z54royU+QkLquxaOPWHUkjchbhK5zUrsFEkdhPsht88KtDalbrvq2gP/O9NEWjKf4XgKwkRdp0V6CJJPFa1F63B4D9SIVk1Pruja3wNmUHiOs69q07fFhmiZdIRg/Udg/jiutOoNPFyO/PvEdamkfFkYLjD9IcbpnrHG89QCMn0/KHaZ2NqHD1aGI0Zo46435vnFGPN/7aTQ6qHNSD4vCrvwXBsPy/WWAyPkDEY4dmvWVHZkv0unvxD+7u70HoV6kspVTwc6I7xET+O7tpICiNR4MWkwRHvS27gK4upPH1nWVrZbGVx2caOMNJgnixcM4cYI3CnffJbcfjaA7b3e7jR3b6v39r+n+O/3QpfdkbvmhrOu6NXi5FQHjbfBCBP02R7wcxn0sXQjqRSpbORX8z+DOxLR40ctoFImunGEt4zj6GhSspYM1KlzRmdBhNluHCTivHS7jheggyKuMh/Fg6x09C/Qg/Bo7Mv3hp9E3LYmw7zfcvGrLxibPL+HWSy5E0I2YZKOfP1utoYtCvUhlK6ciLpik84+vj/HfqT1Hm9B9ywkWo61e7uQ5bpMn/TIqT0Z8vQUtHz0UKf3Hdkb8NOqvuk2hs9GEYjpQ5r+YNvx3tm17BV8YQVejOhv9/Ll+Z8RRL9IJ5hS845vHpvtOOkUvjP9ObQORkTb3OP+d4qdTex52aijeVPW6mJoyKv0X32uu6eYEhwZ8H5+6byVx8BcUxP13OlXTmmzUQmM6//6xYNP9w1nk4glt/hOq/aCr0UhDSevLNdf+UC9SScwpMSp321WWW9pDvPHWGT87zwiNoMc1BT0joEPRw2mjcpPp1CSisRnthNYcjaN92/tu7/1BFt22wmCq8YsnB3CYt22lUX6rhUBn47qu+twWfZKDfz6TjoMQdKv5IMMwHHuOvH+6grufjf7YlrR6MNl0bCRPhnqRSmJO4Xyq4RZzFxOTunKT2bLIrJj/HkwiCqbE+KGYsPwS1nWdOesYDQ24yfWXEuCkNdNW11Hy10EhCDxvHA5LnPXbHkwjIuanzqmF7Xhh6xGcHNWzWqe1LBDtdLHQp+Tp5OMrUoe5dpMDcvHKa3CpF6nkn1PnJTKg8FzBKVPuVqr2jk6O5G8F1IsdaG/XAr20fdyyEG7viGRK/lZAvSAkF/K3AuoFIbmQvxVQLwjJhfytgHpBSC7kbwXUC7IbssZh74jkQv5WQL0gO4AFI/h81JKK503+VkC9SMIsuD4ZLDSOrzfdi3OlEceXR9LoL9bK2afmFlhxd94FXZlbgXsqerHvjD1WWD9+XbBeZ73Ldia37ZjrjGnEB71gXBPcSLKXN1PhhNDbtj37n0i9SCWeU8/Af6fvHeP6HivXdb3oolLjQyAoQBn677x0tqRDvUglnlNPvX+LXVj6yiP9d56G8Ut2dvTuLO0rTEcguN3zBO/HZ0zIadlyiTYv9SKVSE71fe//ndj+hOEA0/robpFKAx1muKvGVi7xTIPrMGb475S2MXwCHg6HYLMTm76wj2srYnJR/M3oK3AJUVUVvNr5XrMQVbxKb4SFK8p5npEuvVkbUcKuU/mJJEQ8+uhtpltpxGYtBCfPY1Mp8hY/DNo/vOP4m+i2xin8h+Og95S+CQWOfDCwIsvwt7JFriO22Hks/6aUJf3/iudXGbsxcZMcQ80R8V1EvUjCzynZVgjXEnqDaas81ppSKN56neeHCj4vIRN6NC7uv1PvoAc4ZWPL/afeCY6w4PjLvEG7xhFdE398LuSLVD7Dp4a04SWZus3i7xY3vv/iacTPgzkJU8Et338npCq4n32rceGi/oGCHHVaitneZv6LrWyBRuCHxtuACwmcEW5z1ozkJJwzRUaRqBdJbOWU77LB3Xds65QDFV8gxH5gosFGrxTWruv8Ws53fqfLCjxx47PZcioC5x/DIU0J0wyRNrzvUE9blC9Acl0H4TuM2iqm5pYfuuSkubW1yzY4ObI1OnhpT5lm3sd36hvMFt/rqhB0UGwcaohiaj160LMx9SKVrZzy3Uw459Agb5pG34J7Pu3vwNT8W7WruOr2y4dfj+kmgAbOpnXoYmPBzghqWuP3SVz+oMkqrzLjiFutd7S60YYyNXakpPpp9H2dysilycatdwabVBH/nRcdVUFuBFs3W9kyeh6PNX4ndNx2g6w7hrpnF4R6kcpWTm350YMzhbIstXvuyJ/xoHfsYBUXrKWDjRS/yQp8/53iiSvYiIDlmAaUZquI6+QHZS7SGfHVQX/Vpr7lW9AYvD8Ws+UgJ3g84iVo1UEzQqQzEnHD5wuceV7nUtd1Iv0PLm+hXqQSzCkc3muu6KpVlzbT3dD/aLy7i3ZBsIp70H+n+Ok0/jv1A37bHj/xDxNAafb9d+q4BYu49kXoju+MxK9I52LLR645RcWFZlKDeoFhwmCszoU2UX/AdStbIrXLVmdEPuvOyLFqSL1IJTGnjEjrmTBdwU7TpB+LO7Pa6qkGVUZ71tSh6PaFGXPRhUm3TvV5CGZ4UrcvhmEwnjj9Iq7NFQUap5D4cUg50FR3xbXX7y0fuUYTt3LbD0gPBCYCMU2cXzcihZkj/UAwW8aod2hfr8dtN8g4+KIsSxx/wfbF2UjMKemfY2Te+FyUMzu0p0Z0/jHcHSydfr2HWTE5BEQbXjAUgHkB31pQanEOo0QAVg1r9IvgMAwIRacRgWJ6wp/ERRBoKJlzj51z8raUNGIJppzGKDmJbHS3npa13uFPQXW61ZDxR0lOWE6K5n3ieAeyBTIR7A6YbInkidsoS/inJEoYt0KJ0s7r8fXB9aDUi1Tyz6nzEhlQeK7IvKZx7P5c8cetHuyb5G8F1IsdwHKmTNYgXxO0VnZc+n1N0HLBwQ7+lEqQ/K2AerED0y17R4RcnGma0rtd+VsB9YKQXMjfCqgXhORC/lZAvSAkF/K3grz04ubmZiTkpfLu3TvqRRK///57QfbmL3/5y95RIMUvv/yytzlukoteOOfev3//luzE//73v7///e9FUfz1r3/973//u3d0Xi7v3r37+vXr3ra4SUZ6QXbk7du3RVHc3Ny8evXqxx9/3Ds6JFOoF8R9+vTp1atX//znP51zNzc3RVH89ttve0eK5Aj1grjvv//+1atXnz9/ds59/fr122+//eabb3JuFZO9oF68dD58+FAUxbt37+TKOI5FUfznP//ZMVYkT6gXL5ovX7588803r1+/NtffvHlTFMUff/yxS6xItlAvXjQ//vhjUBdER9grIRrqxcvl48ePkX4H+ik//fTTlWNFcoZ68ULBuOa3334baUHocVBCHPXixYJ5048fP0ae+fz5s8yzEuKoFy+TP/74I3Fd1k8//ZT5CmVyTagXL5HXr1//7W9/+/Lly4NPfv369fXr1998803Kw+TZQ714cWAT5Pv37xOfx1bAN2/eXDRW5ElAvXhZfPny5dWrV99///1Rv/rXv/5VFMW4fYQPeSFQL14WP/zww6tXrz59+nTUr75+/frNN9989913XI7xwqFevCB++eWXoijevn17wm9/++23k39Lng3Ui5fCn3/++cg2AtomXCT+kqFevBQwBvH27duTvcWhefKPf/xj76SQ3aBevAi+fPlyRodxv//++94JIvtAvXgpfPjw4UFncEVR/Pvf/44/8/79e456vlioF+SOoii4W4REoF6QO6gXJA71gtxBvSBxqBfkDuoFiUO9IHdQL0gc6gW5g3pB4lAvyB3ff/89962TCNQLQkgq1AtCSCrUC0JIKtQLcsc4jlzrTSJQL8gdnB8hcagX5A7qBYlDvSB3UC9IHOoFuYN6QeJQL8gd1AsSh3pB7qBekDjUC3IH9YLEoV6QO6gXJA71ghCSCvWCEJIK9YIQkgr1ghCSCvWC3MHxThKHekHuoF6QONQLcgf1gsShXpA7qBckDvWC3EG9IHGoF+QO6gWJQ70gd1AvSBzqBbmDekHiUC/IHfT3S+JQLwghqVAvCCGpUC8IIalQL8gdPG+ZxKFekDs4P0LiUC/IHdQLEod6Qe6gXpA41AtyB/WCxKFekDuoFyQO9YLcQb0gcagX5A7qBYlDvSB3cP8IiUO9IISkQr0ghKRCvSCEpEK9IHe8ffv2zz//3DsWJF+oF+QOzo+QONQLcgf1gsShXpA7qBckDvWC3EG9IHGoF+QO6gWJQ70gd1AvSBzqBbmDekHiUC/IHVx/QeJQLwghqWSkF58/fx4Jedlk3h/MRS8+ffpUEEKK4uPHj3ub4ya56MU4jkVR/PDDD28Jeam8efOmKIoPHz7sbY6b5KUXOecUIZcmfyugXhCSC/lbAfWCkFzI3wqoF4TkQv5WQL0gJBfytwLqBSG5kL8VUC8uyzAMh1vatu267nJhIZSzvGoYhrIsl2UJ3p3n+XA4lGU5TdNZgiMgfyugXlyQYRiqqlrX1Tm3LEtVVW3bXi64sizLsjzLq+q6Loqi7/utB6ZpKorikXqxrutFBfTJkb8VUC8uiBGIcRzPVf8HWZZlq0VwLFVVVVVV1/XWA2fRi2maqqp6zBueGflbAfXigpRl2TSNvjLP80VDRFvmkaAp1DRNpLWSrheRKNV1faxenEsQ8yR/K6BeXJCmaYqi2OqDYBTgcDhUVTUMAy7iK4YG+r7H52EY8LmqKrRQYGmHwwECVNc1BhT8sBAKfmv6F23b4pZpR/R93zTNOI7+EEbbttL00HqBV8kwDS4ikk3TIG46mbhVFEVZlviVVlIM+ugESiogYdCyqqqemXzkbwXUi8uCku1b8jzPMl44TRNEQe6iYVLX9bquZVnCns0YpG/M/vgIQoFMoEUgZlnXtciEqefruh7HEUHgA4BYINCu60QvcB3PIMLyK9E75xwESL8Q0mNyDMqIVknf9zqZyKi6rruuQ3IiIyxPkfytgHpxcZZlqesa9aFUyGYuAw0E+YpaV36ur2OAMDgU4uuFDgXaIdW11o5lWeQW3iMfdH9KQnf3+yPDMMhj0AuJhnmDtI/kq68XOpRgoPLyZ9a4cE/BCqgXV2KeZ20eUIT2FrTY5WFTDwvSEKjr2q9afb0I9lCcc13X4ZYgzRBoB4QGGoefmAEL8xX6hX6K0QsdAdOQ8fUCQtY0jY6YtIPQvvCT82zI3wqoFxfE2KoeEUCPY7qPPLm1tEHaCMFhwnS9gB2a0KULIC0CyAo+R/QCbxOBe4xeSC9DR0waPtSL3aFeXBAzIKeLu2mZO+fM+MXW1APq/OBMp68X/pN4wIxl6NBl8MLd1vb4inaH3NJ6YVQpoheR/ohEwPRH5nmmXuQD9eKCHA4Hba7od+AzBi9FFEz/IqIXmHMJ9lZ8vcB4oQ5FTFFLiV4HYSp8PSWsk6MXdOlnICuYE3H3BQLWrmPeNA2CW5ZFHsNFNHbWddWaS73YHerFBcHEAczMX6wNY0a3X9ukDByYWUaALom5KPOpeKGWHnQWTCgSFkKRgViMPkg88VWGNuQn+BV0YV1XaB/igGkX+QmexHX9HoCFHkCnFJNKCAs/0fOpZ1z2nhv5WwH1glyQSy+Bf2bkbwXUC3IpMC5b1/WlV7U+G/K3AuoFuRRd12FOlJvKEsnfCqgXhORC/lZAvSAkF/K3AuoFIbmQvxVQLwjJhfytgHpBSC7kbwXUC0JyIX8ryEsvbm5uRkJeKu/evaNeJPHrr78eeYo1Ic+Tm5ubvc1xk1z0YhzHoii+++67/yPkpfL69euiKH7++ee9zXGTvPQi55YYIZcmfyugXhCSC/lbAfWCkFzI3wqoF4TkQv5WQL0gJBfytwLqBSG5kL8VUC8IyYX8rYB6QUgu5G8F1AtCciF/K6BeEJIL+VsB9YKQXMjfCqgXhORC/lZAvSAkF/K3AuoFIbmQvxVQLwjJhfytgHpBSC7kbwXUC0JyIX8roF4Qkgv5WwH1gpBcyN8KqBeE5EL+VjFbStIAAA9tSURBVEC9ICQX8rcC6gUhuZC/FVAvCMmF/K2AekFILuRvBXnpBc9DJC8ZnoeYCs9DJATwPMSHGXkeInnx8DzEVMbse26EXJr8rYB6QUgu5G8F1AtyPeq6xoemafaNSZ7kbwXUi03meT7jq6ZpOtfbzsgZ0+icW9c1creu62VZJNycJWNZFomqzzzP4zjGE3saGVqBgXqxSVmWh8Ph8e+p63ocx2mamqY5r30+nnOlcZqmYRgir+r7vus6faVt23EcHx/0JTgcDmVZbt2d57mqqktUABlagSFrvej7fqfoOOfcMAyPN+/D4SBWsa5rVVWPjdbxzPO8lZCzpNE5N01T13WR1AVv7ZIbKczzPAxD5AHqxc4Ec6pt252icx7meTbVVFVV169U+76/Qm9omqYt++/7Ptj7qOs6twZXItSLnUnXi2VZtoYDUJHqnuc0TdM0yXumaUIBXdcVt9ALxQul7OJr3/fB0jzfEoyYvt62rWmit20Ly0EDXmLoh6LjI1fGcZRW/TRNOqXBbEE9WZYlJEPfjacRoZucRHMPP/S79xG9qOs6mMa+74+tErakxwfxlHD13y0P+P8jCsY4jsH2haSderEziXoh3eB5ng+Hg+6wNE2D/7jrOilSMMuyLDF8MI5jWZbzPK/r2jRNVVUoQCjrRi+CZaKuawSqQ9ERG8dRNKJpGpOEtm1hVGi9t22LGFZVpS1QKl5JlFNtfoTV9700XpA059yyLIfDwU/Ill4E0yh9qLZtJYenaSrLsmkavMpE2EX1wn/4wZ9sER9Z0KCEyH/U931d16IXdV3j/zICBL3w/zj8BP9X27YoUUfFPAXqRSqSU+u6trccDgf5jMd0db2uq1S2umQ757TxO+fKspQ3iPmhlpDPZjTOhdqcOiawH4m8zBQ655qmwdugCOYNCFT/3N2WZkmjti79GH4lKZW06Gd0JLcSErmF0Vn5qsdftJH4oUSMf2sc9AS9cM5FZi4MOld1S8q0a/y0+Ff6vtepYPtiZxLbF03TBDu95v8TiwVbNZIYQ9d1fin0ywTaJvJVPpvqSJoYqJFMikQvtKlo+fCHPCSguIGh6vMDPUovTOjSgXIPqdJp7YuzzM5EkChpQTep9mPup+5wOOgSRb3YmfTxi77vq6qqqsooAoxW0JXkll5I/RPsEj9oS/pJ3RRq2xZxC45fIES/jOLlEI72PtKK3rJJvBay8pj2hf9+feVkvTBtFqHruksPaUv/UQfk/4++SsbzkHqxM8fOjyzLoivSeH8y0uNFkyE4cRvUi2A96VfpABP1+oqMuWy1L5ZlicQ2aJN6xMQ9Ti/80EXg3CP0YhzHoCLroZYLgczp+9508YxKPqgXul/mqBe7E8wpv1Ly/0W5bnoEW0MAhsPhEGlF+317rSwygmgsdl1XGVkwJiFhGevquk6PX+iE62ZU0CZ1l8HdZoUZg5CEmGF/P41m9MSMX5hQ9A/jfSX/FoZmt57fYhzHY1fl+GvSzGiX38wJjl/oTOZ4584k5pQe7eu6Tpd+9DAx3aBHJVF7bE1bGlMHZlpB30JlhVB0AWqapmkahKK7yk6tg8YDEjFJi4kDBvaHYcCEiJ4fQV/MTLWiFYMgUKxl8B8Mw4AZTX0xkkaJMGZhdITlSYSiO0pd15VlubUAbBxHY4GnLb6oqipxfkQwg1lyETpo2j4yP4I/S8+/yl/fNA36v2dfEk69SCUxp7Cw319nAcwyCnerF0Lwnf6/LlP3wV/hYnD9xVYo/vMyJbm1lgSv8teSbIU+3V8/EkzRUWkMrmTRI6/anOJxA1ouh2HwbTgF5NgJP/SJrL8QTNmQvEqfozkK6kUq+efUeYm33p8rqJOx+GXvuORI/lZAvdgBdN0xpbJ3XEhG5G8F1AtCciF/K6BeEJIL+VsB9YKQXMjfCqgXhORC/lZAvSDXo+97zI/s6wkpW/K3AuoFuRJ6zUXbtpdYH/nUyd8KqBebGP8aJ4OVoPAc8fi3nZdzpVHWRG4trPBXf196Z6oQiVVuZGgFhqz14hIumNOpqurx5Uy7WtAL1TPhXGmUPSbjOAbXoWnn4PLkdcwYjpGO+smFlm8+CPUilWP3pz4VfGcW1y+LkbXwZ8Ekyt+LtbW1LNsVrnu1R6gXqTxLvcD2MH3F7AS7DlvuM8+FcSPm64XZD/rg9TgnCO5RDdUdl+pTL1JJ1wsUMmziNts04e2ybVspUthGiUoeezdR0eGwDGwDdbduryQ4vDzo42Ce57qusePTbFWSiEnj3Ow0d7cedGQ9OIY2zDZ5d9tz0X2ZZVkQecQf+9/l5fM8t22LAUWdafBeUZYlHjbb3rfSiFiZHdzyMF5l9uDq/PH3j255i/D38j5Iuv9Od5sQs+4enlOQ+XVda98lyGRsgUV2xU8VODvUi1TS/XdKXaHNCWaMz/4xH/BYhSIr7u1MT9svuH4px05zfDa1kP65+Lzwd4i09/13yvu1ZOijfYxnUASKXVvaGY82IX/79lH++GBF+Lyuq+5HwIoklGDTwNc+d1b/nen+wYWgqw7tGMH0p9i+iJCdXuiLfvtCu35xauO2uW4cwJVlGfQHJ8ViHEf/gaAvGXlM98lNrS5lOu7v1/jXChq/u9/JR0H3W9daIB7jX8t5YwpafeL+cpxzfd8HReS8/n6P5UHXPg86Jbwa1ItUEvUC/6U/C2j8d5qKfasFK8bwSP+dstkUSK8n2B8J6oU4wkN7vlXoaESKMjQLIZ6sF35vQvvFjuvFllhEInCdKRLqxRl5YnohD6NbLu2L0/x3SpM+GNBR/n6Db/DHO8WYt/Ri8nxJaraKso7qY9oXfug6CRG9MGJhWkBd1wVHea+zJoV6cUaemF7o/1W7sTM+Lw0RC4SpB102Bdvq5gq+mrOLnDIYU/Kkq2wKpR5MMbHVthcsyib0uF4YS35QE1P6I1isJbeWZTH/xb7zqY/RiyuvAKJepJKYU7rYYaBbfm58ZOtfRfRCOgg+8bFAd78Xo8fMto7G0c1vU5NjzkWiZOxfPm/phU47mjC6PpdxfngMjKfRHKRuxjt1rPQgtPZhZ8aSJA5GRE44DNE5V9f1sSpzrF44JWRXnvymXqSSmFOY/RqGwV8riU4KpsH0SUKYIdtaFLwsi19qZQwCL9SD55AME4q7nYoLTsJhmtOYB4os0uL/BAej6JEIvB8Tgf4IBQQCpu6fFIl8M/Mm8TTCz7AOBdmIK3o+GH06zdboprl+7EyqRCN9IbnMpyLTRDRlPtWpmXWdA5L/Vz4OmnqRSv45dV5eoP9O3W3xl4cT9xSsgHqxDzg5+crV1+5EPJgT9xSsgHqxD3HX++Rlkr8VUC8IyYX8rYB6QUgu5G8F1AtCciF/K6BekOvB8c44+VsB9YJcCTgcwOen4iDvyuRvBdSLTbD26fHvWZYFm8EyXHFwxjRiGWUkjXqd1bqup63X2p0T1qSmk6EVGKgXm5Rl+XiftNolDFZzPjpe5+QsaRTH3/A8Ekxjq9wIAbPw/Ekwz3NRFJeLdoZWYMhaLy6q5Q9yluaA8cWyy5rOiP/Oc6VRlp9v+ftNv3g1TnNretGRF+pFKhnqxePxjedc/vuPor3wYR+63RTcjx/Zzx7ZVXxpLp0tJ0C9SCVdL/q+RwN4mibfz8IwDNogxX2Ou+1jo+CO44hbKK/YDKY94rVtu+UmF6H4BoCImdBNLx1X4HMQu7yC3X4MeQzDIOYkP8ELEX/d8scePO3a3916+iqKQpwJ6VtbaZTQ/bSs64qxmC3V85PsPO9nwgn+co49HGAcR/jmGMdRbxoOZgvyRNwp+s5QpSwJeNU8z/itXyokJ41rxa3YUi+S0DklO6ObppHPeAxX8Nn42kZpxs/N0BqcNeJh8axjnNn43Xh/mzP8WcK2sa9RbknE0IdHTLQvWSDb54dhEBeS+InYud6XZYrsMAzYJDqOo67JtVtTvTV+KyGRW9jeircZe4bfYCTfeDx0tz6HgyZxRn98R+mFlnXtKAxsZQuGYJBw3wNr0JuxuF8x/5fkJHwOdF0Xd6hBvUglUS+0YTjnxDBM8TUVmnbuqn8uJQ/1g4mSX560M1vtus44oZVCk+6/U/vv8J0Vy+fpvpdgSYvx/XGyfy28Sjd2dJK161A/lHmekQo/rL38d5ommPmLI3oRafUE9UJ3xyRFxo1Qiltz6kUqif0RNAq6rjMNeCiCFhr9262/Sowh3X9ncIAQvhIkdGm5BB1VBPVC1AeO+bT7mUT/nfM8w9GW36hJ1wtxCyjg4AJJvk5IsLfoO2d3yie7YTr+PIGjgG+OLTcWEb2IjGvET0vQf5D2We/SBnepF6mkj1/IIRHG9ZPWCzO0saUXUqs/0t8vCqUOXTrAppSI7yzf8rX/zuk+8syWXqCtK0GcrBf++7ccBW7pBd5puvFbfjqDHf6zg38hxbti/DpI1wt3WyGhAkuZSqdepJKoF1oFdNV37H+sb+lhRU1QL0xNheaG346Qu77/ToRlCpb+eqy/XziDkq+P7I+Y0LVzwC290POp/lfn1bT6yYuuYdN/lj9XdYX2BYa0I28zUC9SCeaUPzhkip00MYzN9H1vTvTcCjfiD9IvN/4UA0IxujBNk1QmumLRbm+N5WvFMUf++F78TDzNKCMiqd+gJ0EeHAo1c5x6OCOiF3oeJ5jbZljEeUcxJbI1pBpkq7TI3WC2nEsv0LlDQzgyo6ShXqSSmFMYQZRBCl2BoCQZa8FXOdHDf2Gw6sPcGHoZbdtq2ZIBAlMCMF3S3qLfhifNXAP6HUhL6x1TIs47JY0yn4ocMIUPyzowySpD8TqNEreUNOL90+14s1zUEzqHw0G3laAyyISgsWnnzBLnE7xvH3UeItx2YiYV/k31XT9bInniNsoSxqr0vhjJJUzJoX1hzq/cgnqRSv45dV4uPTWQIfqMktZbHv78MIKY8o/nbwXUi33ASoq9Y3Ft+r5f13Vd1+svcr0+/oHVDw555m8F1IsdkDOlX4LZvGSWZcGxDOM4pozs5m8F1AtCciF/K6BeEJIL+VsB9YKQXMjfCvLSi5ubm5GQl8q7d++oF0n8/vvvBSGkKH755Ze9zXGTXPTCOff+/fu3hLxs3r179/Xr171tcZOM9IIQkjnUC0JIKtQLQkgq1AtCSCrUC0JIKtQLQkgq1AtCSCrUC0JIKtQLQkgq1AtCSCrUC0JIKtQLQkgq1AtCSCrUC0JIKtQLQkgq1AtCSCrUC0JIKtQLQkgq1AtCSCrUC0JIKtQLQkgq1AtCSCr/D+kCPGGVhUtNAAAAAElFTkSuQmCC" alt="" />
public interface AbstractService {
public void serviceOperation1();
public int serviceOperation2();
public String serviceOperation3();
}
public class ServiceAdapter implements AbstractService{ @Override
public void serviceOperation1() {
} @Override
public int serviceOperation2() {
return 0;
} @Override
public String serviceOperation3() {
return null;
} }
可以看到,接口AbstractService要求定义三个方法,分别是serviceOperation1()、serviceOperation2()、serviceOperation3();而抽象适配器类ServiceAdapter则为这三种方法都提供了平庸的实现。因此,任何继承自抽象类ServiceAdapter的具体类都可以选择它所需要的方法实现,而不必理会其他的不需要的方法。
适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。
在任何时候,如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。这样,从这个抽象类再继承下去的子类就不必实现所有的方法了。
《JAVA与模式》之适配器模式(转)的更多相关文章
-
Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...
-
《JAVA与模式》之适配器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
-
<;代码整洁之道>;、<;java与模式>;、<;head first设计模式>;读书笔记集合
一.前言 几个月前的看书笔记 ...
-
结构型:代理模式 Vs 适配器模式 Vs 门面模式(外观模式)
先上UML图 代理模式: 适配器模式: 门面模式(外观模式): 打了例子……呃……举个比方 代理模式: 水浒街,西门庆看上潘金莲,想和她嘿咻嘿咻,但是自己有不能去找潘金莲去说,于是他找到了金牌代理人王 ...
-
《java与模式》
2012年3月 随笔档案 - java_my_life - 博客园--此网友 12年的博客都是和模式有关的,希望可以多看看.http://www.cnblogs.com/java-my-life/ar ...
-
《JAVA与模式》之装饰模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...
-
Java常见设计模式之适配器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
-
java与模式读后总结
一 老规则边看边写书上的代码,磨磨蹭蹭三个多星期终于把一本1000+的java与模式看完了. 于是,在这里贴上自己对每个模式的思考和总结,其实这个东西在我边看边写的时候已经写了一大半,博文再写一次算是 ...
-
《JAVA设计模式》之适配器模式(Adapter)
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
随机推荐
-
[C++][数据结构][算法]单链式结构的深拷贝
深拷贝(deep-copy),区别于浅拷贝,表示复制所有数据,而不是像浅拷贝一般只复制指针.深拷贝的数据不会因原始数据被delete后而消失. 单链式结构可以实现单链表,栈,队列,树等数据结构.掌握了 ...
-
Spring 依赖注入的方式
Spring 支持3中依赖注入的方式 1.属性注入 通过setter 方法注入Bean的属性或依赖的对象. <bean id = " " class = " &q ...
-
acm算法模板(5)
STL 中 sort 函数用法简介 做 ACM 题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错. ST ...
-
oracle里如何将两个日期的时间差返回**时**分的格式
SELECT EXTRACT(DAY FROM (sysdate-to_date('2012-03-29 00:00:00','YYYY-MM-DD HH24:MI:ss')) DAY TO SECO ...
-
在Servlet中使用spring注入的bean
package abu.csdn.servlet; import java.io.IOException; import javax.servlet.ServletContext; ...
-
SVN和GIT的使用
一.SVN通用流程 1.从服务器仓库的项目上右键拷贝项目地址,然后来到你的电脑桌面上右键“SVN checkout...”,这样就跟服务器建立了关联 2.如果有创建新文件,则右键选择“Tortoise ...
-
Python 自动刷博客浏览量
哈哈,今天的话题有点那什么了哈.咱们应该秉承学习技术的角度来看,那么就开始今天的话题吧. 思路来源 今天很偶然的一个机会,听到别人在谈论现在的"刷量"行为,于是就激发了我的好奇心. ...
-
[转]Request Flow for Provisioning Instance in Openstack
One of the most important use-case in any cloud is provisioning a VM . In this article we shall do ...
-
【绿书】 模拟,rep大坑
https://vjudge.net/contest/229603#problem/B 绿书题 大模拟,绿书上用了个比较麻烦的输入,其实只要getchar()!='0'就行 坑: rep(i,0,s. ...
-
asp.net MVC之AuthorizeAttribute浅析
AuthorizeAttribute是asp.net MVC的几大过滤器之一,俗称认证和授权过滤器,也就是判断登录与否,授权与否.当为某一个Controller或Action附加该特性时,没有登录或授 ...