适配器模式

一、适配器模式

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

二、适用情况

 使用的前提:
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 }

五、缺省适配器模式

转载于:https://www.cnblogs.com/hoje/p/8085545.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值