适配器设计模式初探(Java实现)
本篇随笔主要介绍Java实现设配器设计模式。
先来看下待解决的问题:
    
(图片转自http://blog.csdn.net/jason0539)
由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要使用的是两足插口,就需要适配器来进行转换。(适配器一面是三足插口,一面是两足插口)
适配器模式一般有两种实现方式: 1、类适配器 2、对象适配器。
先来看下类适配器的UML图:
     
客户端只能操纵 Target 接口的 Request 方法来进行需要的操作(当然这里就相当于调用 Request 方法使用 两足插口 进行充电)。而接口具体的实现类有两种,一种是调用 ConcreteTarget 的 Request 方法进行充电(在例子中相当于直接把 两足插口 插入到 两足插座 上,遗憾的是我们现在在欧洲,而欧洲是没有 两足插座 的,只有 三足插座 ,所以 ConcreteTarget 的Request方法我们是不能使用的)。还有一种是调用 Adaptee类 的 SpecificRequest 方法进行充电(这相当于使用 三足插座 进行充电,可是我们现在只有 两足插口 ,是不能将其插入到 三足插座 中进行充电的,换句话说,Adaptee 类的 SpecificRequest 方法我们无法直接调用),这时我们就需要用到 适配器类 Adapter 来将 Adaptee 类的 SpecificRequest 方法转化为我们可以调用的 Request 方法。
接下来看具体的代码实现:
 interface Target {
     void Request();//规定两足插头充电标准,必须插入两足插座
 }
 class Adaptee {
     public void SpecificRequest() {
         System.out.println("把三足插头插在我身上可以进行充电");
     }
 }
 class Adapter extends Adaptee implements Target {
     @Override
     public void Request() {
         // TODO Auto-generated method stub
         //先调用父类的SpecificRequest方法,相当于把转换器的一头插在欧洲的三足插座上,
         //另一头就可以给两足插头进行充电了
         super.SpecificRequest();
         System.out.println("把两足插头插在我身上可以进行充电");
     }
 }
 public class Client {
     public static void charge(Target target) {
         //客户调用 Request 方法进行充电
         target.Request();
     }
     public static void main(String[] args) {
         Adapter ad = new Adapter();//在欧洲先买一个转换器
         charge(ad);//利用转换器进行充电
     }
 }
运行结果:
    
可见两足插头也可进行充电。
2、对象适配器模式实现
UML图:
    
实现方式与类适配器实现方式大致相同,只不过将 Adapter 从 Adaptee 类继承 改为 Adapter 持有 Adaptee 类对象。
 interface Target {
     void Request();//规定两足插头充电标准,必须插入两足插座
 }
 class Adaptee {
     public void SpecificRequest() {
         System.out.println("把三足插头插在我身上可以进行充电");
     }
 }
 class Adapter implements Target {
     private Adaptee adaptee;
     public Adapter(Adaptee adaptee) {
         this.adaptee = adaptee;
     }
     @Override
     public void Request() {
         // TODO Auto-generated method stub
         adaptee.SpecificRequest();
         System.out.println("把两足插头插在我身上可以进行充电");
     }
 }
 public class Client {
     public static void charge(Target target) {
         //客户调用 Request 方法进行充电
         target.Request();
     }
     public static void main(String[] args) {
         Adapter ad = new Adapter(new Adaptee());//在欧洲先买一个转换器并将其一端插入三足插座
         charge(ad);//利用转换器进行充电
     }
 }
运行结果同上。
适配器设计模式一般用于系统后期扩展、修改。
参考文章:http://blog.csdn.net/ymeng_bupt/article/details/6833480
http://blog.csdn.net/jason0539/article/details/22468457
适配器设计模式初探(Java实现)的更多相关文章
- Java设计模式之适配器设计模式(项目升级案例)
		
今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...
 - Java适配器设计模式
		
适配器设计模式,一个接口首先被一个抽象类先实现(此抽象类通常称为适配器类),并在此抽象类中实现若干方法(但是这个抽象类中的方法体是空的),则以后的子类直接继承此抽象类,就可以有选择地覆写所需要的方法. ...
 - JAVA基础—适配器设计模式
		
适配器概念 在计算机编程中,适配器模式将一个类的接口适配成用户所期待的.使用适配器,可以使接口不兼容而无法在一起工作的类协调工作,做法是将类自己包裹在一个已经存在的类中. JDK对适配器设计模式的应用 ...
 - [gkk]传智-适配器设计模式,如同电源适配器
		
//适配器设计模式 是图形化设计中用的.如同电源适配器 import java.awt.*; inport java.awte public calss MyFrame{ public static ...
 - 【设计模式】Java设计模式 - 适配器模式
		
[设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...
 - IOS设计模式第六篇之适配器设计模式
		
版权声明:原创作品,谢绝转载!否则将追究法律责任. 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScr ...
 - 初探Java字符串
		
转载: 初探Java字符串 String印象 String是java中的无处不在的类,使用也很简单.初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是final的. 不过,String是 ...
 - 常用的软件设计模式的Java实现——让编程从野生到飞起
		
常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av7596511/
 - Design Pattern Adaptor 适配器设计模式
		
适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...
 
随机推荐
- Python 正则表达式取值
			
import re class Retest: def __init__(self,string,path): self.string = string self.path = path def re ...
 - Linux下Tomcat的启动和停止(包括杀死tomcat进程)
			
打开终端 cd /java/tomcat #执行 bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina.ou ...
 - RabbitMQ 消息队列 应用
			
安装参考 详细介绍 学习参考 RabbitMQ 消息队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. M ...
 - Install boot2docker defaule username and password
			
username passowrd method docker tcuser ssh root command sudo -i
 - 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法
			
今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...
 - cd命令无效
			
原因是没有切换盘符步骤一:C:\Documents and Settings\Administrator>d:步骤二:cd D:\Program Files\Python35-32\Script ...
 - [转]怎么学习前端,尤其是 JavaScript 这块
			
1. 先看看 w3school ,了解什么是 js,再找几本写 js 小效果的书看看,知道 js 干什么: 2. 然后再去通读 API,推荐 <Javascript权威指南>,第四版吧,第 ...
 - 04 UUID
			
1 什么是UUID UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定. 2 应用场景 MySQL数据库不能想oracle数据库那样创建序列,就 ...
 - Opengl创建机器人手臂代码示例
			
/*******************************************************robot.cpp*基于opengl的机械手臂示例代码*s:机械臂逆时针旋转*S:机械臂 ...
 - R: 判别分析
			
判别与聚类的比较: 聚类分析和判别分析有相似的作用,都是起到分类的作用. 判别分析是已知分类然后总结出判别规则,是一种有指导的学习: 聚类分析则是有了一批样本,不知道它们的分类,甚至连分成几类也不知道 ...