zoukankan      html  css  js  c++  java
  • 软件设计模式之适配器模式(JAVA)

    什么是适配器模式?

    在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

    实现适配器的方式?

    ①对象适配器模式
    -- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
     
    ②类适配器模式
    -- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
     
     
    理论性的东西看起来就是比较烦,下面来举个日常的小例子来更好的了解适配器吧
     
    图1:三相插头                 图2:二孔插座            图3:三相插头转二相的转换器
                
     
    看完上面三幅图,我想大家应该都一目了然了,想把三相插头插到二孔插座里,只能中间加个转换器,这里我们可以简单把它理解成我们今天要说的适配器
    再回过头看看文章开始的这句话"适配器能将因为接口不兼容而不能在一起工作的类工作在一起",没错,在两个原本不能工作到一起的组件中间添加适配器,就可以把它们关联起来了。
     
    适配器模式里面存在着3种角色:
    1、目标角色(Target):也就是客户理想中想要的接口,比如三相插头,客户想找的插孔就是三孔插座(目标角色)。
    2、源(Adatee):现有的接口,也就是不满足客户想要的接口,也就是这个二孔插座(源)。
    3、适配器(Adapter):能将二孔插座转换成"三孔插座"的组件,也就是上图的三相插头转二相插头转化器(适配器)。
     
     
    就以上面的例子,用代码来讲下适配器模式吧
    首先先来说下对象适配器模式
     
    以笔记本通电为例,大家都知道正常的笔记本电源是三相接口
     
    ThreeSocket.java
    这是一个需求接口,也就是客户期待的,也就是3种角色中的目标接口(Target)
    1 package com.lcw.adapter.test;
    2 
    3 public interface ThreeSocket {
    4     
    5     //需要一个三孔插座,也就是客戶的需求
    6     public void needThreeSocket();
    7 
    8 }

    TwoSocket.java

    这是现有的组件,也就是那个二孔插座,也就是3种角色中的源(Adatee),虽然能通电,但接口是不满足客户的需要

    1 package com.lcw.adapter.test;
    2 
    3 public class TwoSocket {
    4     // 现有的插座,只有二孔,已经有了供电功能,只是缺少了三孔接口
    5     public void serverTwo() {
    6         System.out.println("我是一个二孔插座,我有供电功能");
    7     }
    8 
    9 }

    ThreeToTwoAdapter.java

    这是适配器类,它需要2孔插座来提供电,并实现三孔插座,在构造方法中传入现有组件2孔插座的对象(带电)

     1 package com.lcw.adapter.test;
     2 
     3 public class ThreeToTwoAdapter implements ThreeSocket{
     4     private TwoSocket socket;
     5     public ThreeToTwoAdapter(TwoSocket two) {
     6         this.socket=two;
     7     }
     8     //现在已经有2孔插座的对象(意味着有通电功能)
     9     @Override
    10     public void needThreeSocket() {
    11         socket.serverTwo();
    12         System.out.println("二孔接口已转换成三孔接口,并注入电");
    13     }
    14     
    15 }

    这样一来,适配器类这个中间类就有了源(二孔插座)的效果也就是"电"

    然后再实现了目标接口方法,也就是开通了三相接口,把"电"注入,这样就可以把2个本无法一起工作的类聚集到一起,类似红娘在它们之间牵了一条关系线

    Computer.java 笔记本类,它需要的是三孔接口

     1 package com.lcw.adapter.test;
     2 
     3 public class Computer {
     4     //笔记本电脑的电源插头需求是3孔
     5     private ThreeSocket three;
     6     public Computer(ThreeSocket three){
     7         this.three=three;
     8     }
     9     public void server(){
    10         System.out.println("笔记本通电成功!");
    11     }
    12     
    13 }

    来写个测试类

     1 package com.lcw.adapter.test;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         //现有插座两孔,已经有提供电的功能,只是缺少3孔接口
     6         TwoSocket two=new TwoSocket();
     7         //把具有通电功能的对象传递进去,目的是要开通3孔接口的通电功能
     8         ThreeSocket three=new ThreeToTwoAdapter(two);
     9         //得到一个满足笔记本电源接口且具有电的功能对象
    10         Computer computer=new Computer(three);
    11         three.needThreeSocket();
    12         computer.server();
    13     }
    14 }

    看下效果图:

    好了,这样就把2个原本不能在一起工作的类链接到一起了。

    接着来说下类适配器模式

    类适配器顾名思义不同点在于适配器,既然突出了'类",我们一般都会联想到继承

    嗯,没错,类适配器的做法就是让适配器去继承已有功能(二孔插座)的类,然后再实现期望接口(三孔插座)

    具体看代码吧,除了测试类和适配器类,其他的类与上面的保持一致,这里就不再贴出

    ThreeToTwoExtendsAdapter.java(适配器类)

    1 package com.lcw.adapter.test;
    2 
    3 public class ThreeToTwoExtendsAdapter extends TwoSocket implements ThreeSocket{
    4     public void needThreeSocket() {
    5         this.serverTwo();
    6         System.out.println("二孔接口已转换成三孔接口");
    7     }
    8     
    9 }

    Test.java(测试类)

     1 package com.lcw.adapter.test;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         //由于ThreeToTwoExtendsAdapter继承了源,所以具有源的功能(电),并实现了3孔接口
     6         ThreeSocket socket=new ThreeToTwoExtendsAdapter();
     7         //插入接口
     8         Computer computer=new Computer(socket);
     9         socket.needThreeSocket();
    10         computer.server();
    11     
    12     }
    13 }

    效果依旧:

    总结下:

    ①对象适配模式:

    把"被适配者"作为一个对象组合到适配器中,以修改目标接口包装被适配者。

    (例如上面例子,二孔插座就是被适配者,把对象传入适配器并实现接口方法改造)

    ②类适配模式:

    通过多重继承和实现接口的方式,单一的为某个类而实现适配。

    适配器的作用?

    1、透明:通过适配器客户端可以调用统一接口,对于客户端是透明的,这样做可以更加简洁, 直接,紧凑。

    2、复用:复用了现存的类,解决因环境要求不一致的问题。

    3、低耦合:将目标类与源类解耦,引入一个适配器重用源类(适配器类),遵守开放-关闭原则。

    作者:Balla_兔子
    出处:http://www.cnblogs.com/lichenwei/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

  • 相关阅读:
    洛谷—— P3353 在你窗外闪耀的星星
    洛谷—— P1238 走迷宫
    洛谷—— P1262 间谍网络
    9.8——模拟赛
    洛谷—— P1189 SEARCH
    算法
    May 22nd 2017 Week 21st Monday
    May 21st 2017 Week 21st Sunday
    May 20th 2017 Week 20th Saturday
    May 19th 2017 Week 20th Friday
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3948348.html
Copyright © 2011-2022 走看看