• java适配器模式


       Java适配器模式

    (摘自百度文库)

    问题引出:大家生活中可能碰到的一个问题就是你新买的手机自带的耳机是2.5接口的,不幸的是有一天你的耳机坏了,你去市面上根本就找不到2.5的耳机了,基本上是3.5接口了,没办法你只好买了个3.5接口的耳机,老板告诉你:“我给你一个适配器”这不问题就解决了。

    问题分析:3.5的接口的耳机在你手机上本来是没法使用的,因为它没有按照2.5接口的设计啊,而现在我又想使用这幅耳机,于是乎有了“适配器(Adapter)”这个一个东西出来了。

    Adapter模式的定义:把一个类的接口变换成客户端所期待的另外一种接口,使得原本由于接口不兼容而不能再一起工作的那些类可以一起工作。

    适配器模式分类:1.类的适配器模式(采用继承实现)2.对象适配器(采用对象组合方式实现)

    类的适配器类图:

     

     

     

     

    模式的构成:以问题中例子为模型

    目标抽象角色(Target):定义客户所期待要使用的接口,我们把手机当做客户端,客户端所需要使用的耳机的接口是2.5的,在这里就可以抽象出来一个2.5接口的设备(并不一定是耳机)。

    源角色(Adaptee):需要被适配的接口,在这里指的是我们从市场上买回来的那个3.5接口的耳机。

    适配器角色(Adapter)用来把源接口转换成符合要求的目标接口的设备,在这里指的是老板送给我们的那个“转换器”。

    客户端(Client)这里指的就是那个给我们带来麻烦的手机喽。

    示例代码:

    Java代码  

    1. //Target   
    2.   
    3. package pattern.adapter;   
    4.   
    5. public interface Target {   
    6.   
    7.     public void provide2_5();   
    8.   
    9. }   
    10.   
    11. //Adaptee   
    12.   
    13. package pattern.adapter;   
    14.   
    15. public class Adaptee {   
    16.   
    17.     public void provide3_5(){   
    18.   
    19.        System.out.println("我是一个3.5的接口哦");   
    20.   
    21.     }   
    22.   
    23. }   
    24.   
    25. //Adapter   
    26.   
    27. package pattern.adapter;   
    28.   
    29. public class Adapter extends Adaptee implements Target {   
    30.   
    31.     @Override  
    32.   
    33.     public void provide2_5() {   
    34.   
    35.        this.provide3_5();   
    36.   
    37.     }   
    38.   
    39. }   
    40.   
    41. //Client   
    42.   
    43. package pattern.adapter;   
    44.   
    45. public class CellPhoneClient {   
    46.   
    47.     public static void main(String[] args) {   
    48.   
    49.        Target target = new Adapter();   
    50.   
    51.        //该手机只支持2.5接口的耳机   
    52.   
    53.        target.provide2_5();   
    54.   
    55.     }   
    56.   
    57. }  

    //Target

     

    package pattern.adapter;

     

    public interface Target {

     

        public void provide2_5();

     

    }

     

    //Adaptee

     

    package pattern.adapter;

     

    public class Adaptee {

     

        public void provide3_5(){

     

           System.out.println("我是一个3.5的接口哦");

     

        }

     

    }

     

    //Adapter

     

    package pattern.adapter;

     

    public class Adapter extends Adaptee implements Target {

     

        @Override

     

        public void provide2_5() {

     

           this.provide3_5();

     

        }

     

    }

     

    //Client

     

    package pattern.adapter;

     

    public class CellPhoneClient {

     

        public static void main(String[] args) {

     

           Target target = new Adapter();

     

           //该手机只支持2.5接口的耳机

     

           target.provide2_5();

     

        }

     

    }

     

     输出结果

    :我是一个3.5的接口哦

    从输出结果可以看出只支持2.5接口的手机成功的使用3.5的耳机了。这就是适配器模式的作用。

    对象的适配器模式:

     

     

     

    对象的适配器模式的不同之处在于Adapter角色封装了Adaptee角色,而不像类的适配器模式所采取的继承方式。其原理基本上是相似的。

    应用适配器模式的场景:

    1.系统需要使用现有的类,而现有类不符合当前系统的要求。如问题的提出。

    2.系统要建立一个可以重复使用的类,用来与彼此没有太大关联的类或者在将来要引用的类一起工作。

    java适配器模式之--对象适配器模式(转)

    上次谈到类适配器,由于类的适配器只能用于单一源的适配,显然有多个源时显然满足需要,此时我们需要运用对象的适配器模式,对象的适配器模式是把一个源聚合到适配器类中去,从而能够满足多源的要求。看看代码

    源代码:

    public class Person {

    private String name;
    private String sex;
    private int age;

    public void speakJapanese(){
       System.out.println("I can speak Japanese!");
    }

    public void speakEnglish(){
       System.out.println("I can speak English!");
    }
    ...//以下省略成员变量的get和set方法
    }

    目标接口

    public interface Job {

    public abstract void speakJapanese();
    public abstract void speakEnglish();
    public abstract void speakFrench();

    }

    对象适配器类

    public class Adapter implements Job {

    Person person;

    public Adapter(Person person) {
       this.person = person;
    }

    public void speakEnglish() {
       person.speakEnglish();
    }

    public void speakJapanese() {
       person.speakJapanese();
    }

    //new add
    public void speakFrench() {
      
    }

    }

    可以看出对象适配器类通过聚合引入了源对象,并实现了目标对象的方法speakFrench(或者照搬),将源对象做为适配器的成员变量,通过构造子来设定源对象。

    思考:

    1. 一个适配器可以将多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。

    2. 与类的适配器模式相比,要想置换源类的的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源进行适配。

    3. 虽然要想置换掉源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增的方法可以同时适用于所有的源。

  • 相关阅读:
    AOP AspectJ 字节码 语法 MD
    判断小米华为等系统 MD
    vuejs2.0实现分页组件,使用$emit进行事件监听数据传递
    vuejs2.0实现一个简单的分页
    vuejs2.0使用Sortable.js实现的拖拽功能
    JavaScript之Number、String、Array常用属性与方法手册
    CSS3效果:5种预载动画效果
    vuejs 1.x
    window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果
    如何用JavaScript判断dom是否有存在某class的值?
  • 原文地址:https://www.cnblogs.com/lyunyu/p/3015484.html
Copyright © 2020-2023  润新知