• 适配器模式


    一、适配器模式

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

    二、适用情况

     使用的前提:
    1.接口中规定了所有要实现的方法
    2.但一个要实现此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
     实现方法:
    1.用一个抽象类实现已有的接口,并实现接口中所规定的所有方法,这些方法的实现可以都是“平庸”实现----空方法;但此类中的方法是具体的方法,而不是抽象方法,否则的话,在具体的子类中仍要实现所有的方法,这就失去了适配器本来的作用。
    2.原本要实现接口的子类,只实现1中的抽象类即可,并在其内部实现时,只对其感兴趣的方法进行实现。
    三、使用一个适配器编程
    1 package com.jmu.worker;
    2 
    3 public interface IProgrammer {
    4  String programmer();
    5  
    6 }
    1 package com.jmu.worker;
    2 
    3 public interface ICooker {
    4  String cooker();
    5  
    6 }
     1 package com.jmu.worker.impl;
     2 
     3 import com.jmu.worker.IProgrammer;
     4 
     5 public class JdProgrammer implements IProgrammer {
     6 
     7     @Override
     8     public String programmer() {
     9         // TODO Auto-generated method stub
    10         
    11         return "编写高效程序";
    12     }
    13 
    14 }
    package com.jmu.worker.impl;
    
    import com.jmu.worker.ICooker;
    
    public class JmuCooker implements ICooker{
    
        @Override
        public String cooker() {
            // TODO Auto-generated method stub
            
            return "沙茶面";
        }
    
    }
    1 package com.jmu.adapters;
    2 
    3 public interface IWorkerAdapter {
    4  String work(Object worker);
    5 }
     1 package com.jmu.adapters.impl;
     2 
     3 import com.jmu.adapters.IWorkerAdapter;
     4 import com.jmu.worker.ICooker;
     5 import com.jmu.worker.IProgrammer;
     6 //适配器类
     7 public class WorkerAdapeterImpl implements IWorkerAdapter {
     8 
     9     @Override
    10     public String work(Object worker) {
    11         // TODO Auto-generated method stub
    12         String workerContent="";
    13         //若传来的是厨师,则调用cooker()方法
    14         if(worker instanceof ICooker){//instanceof:它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。
    15             workerContent=((ICooker)worker).cooker();
    16         }else if (worker instanceof IProgrammer) {
    17             workerContent=((IProgrammer)worker).programmer();
    18         }
    19         return workerContent;
    20     }
    21 
    22 }
     1 package com.jmu.test;
     2 
     3 import com.jmu.adapters.IWorkerAdapter;
     4 import com.jmu.adapters.impl.WorkerAdapeterImpl;
     5 import com.jmu.worker.ICooker;
     6 import com.jmu.worker.IProgrammer;
     7 import com.jmu.worker.impl.JdProgrammer;
     8 import com.jmu.worker.impl.JmuCooker;
     9 
    10 public class MyTest {
    11 
    12     public static void main(String[] args) {
    13         // TODO Auto-generated method stub
    14         ICooker jmuCooker=new JmuCooker();
    15         IProgrammer jdProgrammer=new JdProgrammer();
    16         IWorkerAdapter iWorkerAdapter=new WorkerAdapeterImpl();
    17         Object[] works={jmuCooker,jdProgrammer};
    18         for (Object worke : works) {
    19             String workContent = iWorkerAdapter.work(worke);
    20             System.out.println(workContent);
    21         }
    22     }
    23 
    24 }

    运行结果:

    沙茶面
    编写高效程序
    四、多个适配器编程
     
    1 package com.jmu.adapters;
    2 
    3 public interface IWorkerAdapter {
    4  String work(Object worker);
    5  boolean supports(Object worker);
    6  
    7 }
     1 package com.jmu.adapters.impl;
     2 
     3 import com.jmu.adapters.IWorkerAdapter;
     4 import com.jmu.worker.ICooker;
     5 
     6 public class CookerAdapter implements IWorkerAdapter {
     7 
     8     @Override
     9     public String work(Object worker) {
    10         // TODO Auto-generated method stub
    11         return  ((ICooker)worker).cooker();
    12     }
    13 
    14     @Override
    15     public boolean supports(Object worker) {
    16         // TODO Auto-generated method stub
    17         return (worker instanceof ICooker);
    18     }
    19 
    20 }
     1 package com.jmu.test;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import com.jmu.adapters.IWorkerAdapter;
     7 import com.jmu.adapters.impl.CookerAdapter;
     8 import com.jmu.adapters.impl.ProgrammerAdapter;
     9 import com.jmu.worker.ICooker;
    10 import com.jmu.worker.IProgrammer;
    11 import com.jmu.worker.impl.JdProgrammer;
    12 import com.jmu.worker.impl.JmuCooker;
    13 
    14 public class MyTest {
    15 
    16     public static void main(String[] args) {
    17         // TODO Auto-generated method stub
    18         ICooker jmuCooker=new JmuCooker();
    19         IProgrammer jdProgrammer=new JdProgrammer();
    20       //循环遍历每个工种对象,让每个工种对象在适配器中逐个进行匹配
    21         Object[] works={jmuCooker,jdProgrammer};
    22         for (Object worker : works) {
    23             IWorkerAdapter adapter=getAdapter(worker);
    24             System.out.println(adapter.work(worker));
    25             
    26         }
    27     } 
    28 //根据worker获取相应的适配器对象
    29     private static IWorkerAdapter getAdapter(Object worker) {
    30         // TODO Auto-generated method stub
    31         List<IWorkerAdapter>  adapters=getAllAdapters();
    32         for (IWorkerAdapter adapter : adapters) {
    33             if(adapter.supports(worker)){
    34                 return adapter;
    35             }
    36         }
    37         return null;
    38     }
    39 //获取所有的适配器
    40     private static List<IWorkerAdapter> getAllAdapters() {
    41         // TODO Auto-generated method stub
    42     List<IWorkerAdapter> adapters=new ArrayList<IWorkerAdapter>();
    43     adapters.add(new CookerAdapter());
    44     adapters.add(new ProgrammerAdapter());
    45         return adapters;
    46     }
    47 
    48 }

    五、缺省适配器模式

  • 相关阅读:
    h5 . css入门 2.CSS基础
    html5与css 1. web标准及组成
    SQL编程
    JMeter学习(八)JDBC测试计划-连接Oracle
    JMeter学习(七)聚合报告之 90% Line 正确理解
    JMeter学习(六)集合点
    JMeter学习(五)检查点
    JMeter学习(十四)jmeter_断言使用
    JMeter学习(四)参数化
    JMeter学习(三)元件的作用域与执行顺序
  • 原文地址:https://www.cnblogs.com/hoje/p/8085545.html
Copyright © 2020-2023  润新知