zoukankan      html  css  js  c++  java
  • 适配器设计模式初探(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 方法。

        接下来看具体的代码实现:

        

     1 interface Target {
     2     void Request();//规定两足插头充电标准,必须插入两足插座
     3 }
     4 
     5 class Adaptee {
     6     public void SpecificRequest() {
     7         System.out.println("把三足插头插在我身上可以进行充电");
     8     }
     9 }
    10 
    11 class Adapter extends Adaptee implements Target {
    12 
    13     @Override
    14     public void Request() {
    15         // TODO Auto-generated method stub
    16         
    17         //先调用父类的SpecificRequest方法,相当于把转换器的一头插在欧洲的三足插座上,
    18         //另一头就可以给两足插头进行充电了
    19         super.SpecificRequest();
    20                 
    21         System.out.println("把两足插头插在我身上可以进行充电");
    22     }
    23     
    24 }
    25 public class Client {
    26     
    27     public static void charge(Target target) {
    28         //客户调用 Request 方法进行充电
    29         target.Request();
    30     }
    31     
    32     public static void main(String[] args) {
    33         Adapter ad = new Adapter();//在欧洲先买一个转换器
    34         charge(ad);//利用转换器进行充电
    35     }
    36     
    37 
    38 }

        

        运行结果:

        

        可见两足插头也可进行充电。

        2、对象适配器模式实现

        UML图:

        

        实现方式与类适配器实现方式大致相同,只不过将 Adapter 从 Adaptee 类继承 改为  Adapter 持有 Adaptee 类对象。

        

     1 interface Target {
     2     void Request();//规定两足插头充电标准,必须插入两足插座
     3 }
     4 
     5 class Adaptee {
     6     public void SpecificRequest() {
     7         System.out.println("把三足插头插在我身上可以进行充电");
     8     }
     9 }
    10 
    11 class Adapter implements Target {
    12     
    13     private Adaptee adaptee;
    14     
    15     public Adapter(Adaptee adaptee) {
    16         this.adaptee = adaptee;
    17     }
    18     
    19     @Override
    20     public void Request() {
    21         // TODO Auto-generated method stub
    22         adaptee.SpecificRequest();
    23                 
    24         System.out.println("把两足插头插在我身上可以进行充电");
    25     }
    26     
    27 }
    28 public class Client {
    29     
    30     public static void charge(Target target) {
    31         //客户调用 Request 方法进行充电
    32         target.Request();
    33     }
    34     
    35     public static void main(String[] args) {
    36         Adapter ad = new Adapter(new Adaptee());//在欧洲先买一个转换器并将其一端插入三足插座
    37         charge(ad);//利用转换器进行充电
    38     }
    39     
    40 
    41 }

        

        运行结果同上。

        适配器设计模式一般用于系统后期扩展、修改。

        参考文章:http://blog.csdn.net/ymeng_bupt/article/details/6833480

             http://blog.csdn.net/jason0539/article/details/22468457

        

        

        

  • 相关阅读:
    常见数据结构图文详解-C++版
    求单链表中环的起点,原理详解
    Qt Creator 整合 python 解释器教程
    Qt 共享库(动态链接库)和静态链接库的创建及调用
    qt creator 中的"提升为..."功能简介
    QT 操作 excel 教程
    网易2017校园招聘算法题c语言实现源码
    c语言版贪吃蛇小游戏
    mysql语法结构
    Spring MVC rest接收json中文格式数据显示乱码
  • 原文地址:https://www.cnblogs.com/Michaelwjw/p/5889742.html
Copyright © 2011-2022 走看看