zoukankan      html  css  js  c++  java
  • 3.适配器模式

    【基本介绍】

      适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,起别名为包装器。主要分为:类适配器模式、对象适配器模式、接口适配器模式。

    1.类适配器模式

      案例说明:将220V交流电(src 被适配者)通过充电器(相当于Adapter)转换成5V(dst 目标)。

      Adapter通过继承src类,实现dst类的接口完成 src-》dst的适配。

    1 //适配接口
    2 public interface IVoltage5V {
    3     public int output5V();
    4 }
    5V电流接口
     1 public class Phone {
     2     //充电
     3     public void charging(IVoltage5V iVoltage5V) {
     4         if(iVoltage5V.output5V() == 5) {
     5             System.out.println("电压为5V, 可以充电~~");
     6         } else if (iVoltage5V.output5V() > 5) {
     7             System.out.println("电压大于5V, 不能充电~~");
     8         }
     9     }
    10 }
    手机类(接口应为5V)
    1 //被适配的类
    2 public class Voltage220V {
    3     //输出220V的电压
    4     public int output220V() {
    5         int src = 220;
    6         System.out.println("电压=" + src + "伏");
    7         return src;
    8     }
    9 }
    22V交流电类
     1 //适配器类
     2 public class VoltageAdapter extends Voltage220V implements IVoltage5V {
     3     @Override
     4     public int output5V() {
     5         // TODO Auto-generated method stub
     6         //获取到220V电压
     7         int srcV = output220V();
     8         int dstV = srcV / 44 ; //转成 5v
     9         return dstV;
    10     }
    11 }
    充电器Adapter
    1 public class Client {
    2     public static void main(String[] args) {
    3         // TODO Auto-generated method stub
    4         System.out.println(" === 类适配器模式 ====");
    5         Phone phone = new Phone();
    6         phone.charging(new VoltageAdapter());
    7     }
    8 }
    开始充电

     2.对象适配器模式

      基本思路和类适配器模式相同,只是将Adapter类做修改,不在继承src(220V)类(使用组合代替继承),而是持有src类的实例(作为成员变量,通过构造器传入),以解决兼容性问题。即 持有src类,实现dst类的接口完成 src-》dst的适配。

     1 //适配器类
     2 public class VoltageAdapter  implements IVoltage5V {
     3 
     4     private Voltage220V voltage220V; // 关联关系-聚合
     5     
     6     //通过构造器,传入一个 Voltage220V 实例
     7     public VoltageAdapter(Voltage220V voltage220v) {
     8         this.voltage220V = voltage220v;
     9     }
    10     
    11     @Override
    12     public int output5V() {
    13         int dst = 0;
    14         if(null != voltage220V) {
    15             int src = voltage220V.output220V();//获取220V 电压
    16             System.out.println("使用对象适配器,进行适配~~");
    17             dst = src / 44;
    18             System.out.println("适配完成,输出的电压为=" + dst);
    19         }
    20         return dst;
    21     }
    22 }
    适配器
    1 public class Client {
    2     public static void main(String[] args) {
    3         // TODO Auto-generated method stub
    4         System.out.println(" === 对象适配器模式 ====");
    5         Phone phone = new Phone();
    6         phone.charging(new VoltageAdapter(new Voltage220V()));
    7     }
    8 }
    开始充电

    3.接口适配器模式

       当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择的覆盖父类的某些方法来实现需求。适用于一个接口不想使用其所有的方法的情况。

    1 public interface Interface4 {
    2     public void m1();
    3     public void m2();
    4     public void m3();
    5     public void m4();
    6 }
    接口
     1 //在AbsAdapter 我们将 Interface4 的方法进行默认实现
     2 public abstract class AbsAdapter implements Interface4 {
     3     //默认实现(空方法)
     4     public void m1() {
     5     }
     6     public void m2() {
     7     }
     8     public void m3() {
     9     }
    10     public void m4() {
    11     }
    12 }
    抽象类
     1 public class Client {
     2     public static void main(String[] args) {
     3         AbsAdapter absAdapter = new AbsAdapter() {
     4             //只需要去覆盖我们 需要使用 接口方法
     5             @Override
     6             public void m1() {
     7                 // TODO Auto-generated method stub
     8                 System.out.println("使用了m1的方法");
     9             }
    10         };
    11         absAdapter.m1();
    12     }
    13 }
    测试
  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/qmillet/p/12112038.html
Copyright © 2011-2022 走看看