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

 对象适配器

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

生活中的例子:
在生活中最简单的例子就是电源适配器,如手机适配器,我们的家用电源是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. interface ITarget { 
  16.     int GetPower10V(); 
  17.  
  18. class Power { 
  19.     int GetPower220V() { 
  20.          return 220
  21.     } 
  22.  
  23. class MobilePowerAdapter  implements ITarget  
  24.     private Power power; 
  25.     public MobilePowerAdapter( ) { 
  26.           
  27.         this.power = new Power(); 
  28.     } 
  29.      
  30.     @Override 
  31.     public int GetPower10V() { 
  32.         // TODO Auto-generated method stub 
  33.          power.GetPower220V(); 
  34.          //将220v转变成10v,具体做法就不写了, 大家明白就行 
  35.          return 10
  36.     } 

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

分享至
更多 0
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:设计模式┆阅读(2461)┆评论(2) ┆ 返回博主首页返回博客首页
原文地址:https://www.cnblogs.com/kexb/p/3666334.html