设计模式之Adapter设计模式

 这个设计模式是我这两天刚学的,这儿算是我的读书笔记发布出来是供大家一起学习,后面有我自己的感悟,下面是我网上整理的

 

以下情况使用适配器模式
• 你想使用一个已经存在的类,而它的接口不符合你的需求。
• 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
• (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
 

其实现方式主要有两种:
类适配器


 

对象适配器

其中:
• Target
— 定义Client使用的与特定领域相关的接口。
• Client
— 与符合Ta rg e t接口的对象协同。
• Adaptee
— 定义一个已经存在的接口,这个接口需要适配。
• Adapter
— 对Adaptee的接口与Target接口进行适配


具体的实现代码如下:
类适配器

  1. package com.visionsky.DesignPattern; 
  2.  
  3. interface Target { 
  4.     void Request(); 
  5. } 
  6.  
  7. class Adaptee { 
  8.     void SpecificRequst() { 
  9.         System.out.println("Adaptee's SpecificRequst"); 
  10.     } 
  11. } 
  12.  
  13. class Adapter extends Adaptee implements Target  
  14. { 
  15.  
  16.     @Override 
  17.     public void Request() { 
  18.          System.out.println("Adapter's Request"); 
  19.           super.SpecificRequst(); 
  20.     } 
  21.  
  22. } 
  23.  
  24. public class AdapterDemo { 
  25.  
  26.     /** 
  27.      * @param args 
  28.      */ 
  29.     public static void main(String[] args) { 
  30.         // TODO Auto-generated method stub 
  31.         Target t=new Adapter(); 
  32.         t.Request(); 
  33.     } 
  34.  
  35. }
  36. //我的点评:类适配器存在不灵活的地方因为他为了实现Adaptee 里的特殊需求而使用了继承,我们知道继承在OO里其实破坏了类的封装性,这里如果被继承的类Adaptee 改动一下那么Adapter类也会随之改变这就破坏了OO里的原则破坏 了类的封装性
  37. //而如果使用下面的对象适配器的话就不会出现这个问题,上面是完全写死了的一种适配器不灵活,而下面你其实也可以通过传入一个你需要适配的类型参数(使用泛T)如Adaptee 的类型然后使用反射动态创建出该类型的实例,使用现在流行的T4模板还可以创建出多种不同需求的适配器类型。

 对象适配器

  1. package com.visionsky.DesignPattern; 
  2.  
  3. interface Target { 
  4.     void Request(); 
  5. } 
  6.  
  7. class Adaptee { 
  8.     void SpecificRequst() { 
  9.         System.out.println("Adaptee's SpecificRequst"); 
  10.     } 
  11. } 
  12.  
  13. class Adapter  implements Target  
  14. { 
  15.  
  16.     private Adaptee adaptee; 
  17.     public Adapter() 
  18.     { 
  19.         this.adaptee=new Adaptee(); 
  20.     } 
  21.      
  22.     @Override 
  23.     public void Request() { 
  24.          System.out.println("Adapter's Request"); 
  25.          adaptee.SpecificRequst(); 
  26.     } 
  27.  
  28. } 
  29.  
  30. public class AdapterDemo { 
  31.  
  32.     /** 
  33.      * @param args 
  34.      */ 
  35.     public static void main(String[] args) { 
  36.         // TODO Auto-generated method stub 
  37.         Target t=new Adapter(); 
  38.         t.Request(); 
  39.     } 
  40.  
  41. } 

生活中的例子:
在生活中最简单的例子就是电源适配器,如手机适配器,我们的家用电源是220V的,但是,对于手机来说,根本大不了这么多,所以,在这种情况下,需要电源适配器来为我们提供适合手机的电压。
 

  1. package com.visionsky.DesignPattern; 
  2.  
  3. public class AdaterDemoInLife { 
  4.  
  5.     /** 
  6.      * @param args 
  7.      */ 
  8.     public static void main(String[] args) { 
  9.         // TODO Auto-generated method stub 
  10.         MobilePowerAdapter mpa=new MobilePowerAdapter(); 
  11.         mpa.GetPower10V(); 
  12.     } 
  13.  
  14. } 
  15.  
  16. interface ITarget { 
  17.     int GetPower10V(); 
  18. } 
  19.  
  20. class Power { 
  21.     int GetPower220V() { 
  22.          return 220; 
  23.     } 
  24. } 
  25.  
  26. class MobilePowerAdapter  implements ITarget  
  27. { 
  28.     private Power power; 
  29.     public MobilePowerAdapter( ) { 
  30.           
  31.         this.power = new Power(); 
  32.     } 
  33.      
  34.     @Override 
  35.     public int GetPower10V() { 
  36.         // TODO Auto-generated method stub 
  37.          power.GetPower220V(); 
  38.          //将220v转变成10v,具体做法就不写了, 大家明白就行 
  39.          return 10; 
  40.     } 
  41. } 

 

本文出自 “学习笔记” 博客,请务必保留此出处http://visionsky.blog.51cto.com/733317/384607

分享至
更多 0
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:设计模式┆阅读(2461)┆评论(2) ┆ 返回博主首页┆返回博客首页

posted on 2014-04-15 15:13  听哥哥的话  阅读(305)  评论(0)    收藏  举报

导航