适配器设计模式
定义:将某个类的接口转换为客户所需要的类型,解决的问题是,使得原来由于接口不兼容而不能一起工作、不能统一管理的那些类可以在一起工作,可以进行统一管理。
需求:初始的工作是cook(),程序员的工作是program(),司机的工作是drive(),教室的工作是teach(),不同的工种,其具体的额工作内容不同,现在程序要将这些(例如30个不同的工种)不同工种的工作内容全部输出。
解决方案一:逐个访问每一个工种对象的相应工作的方法,无法循环遍历,无法统一管理
解决方案二:使用适配器设计模式,将这些不兼容的具体工作转换为一个统一的工作,实现循环遍历。
方案一:不使用适配器设计模式
定义的工人的接口和实体类 worker包中的代码
publicinterface ICooker {
public String cook();
}
publicinterface IProgrammer {
public String program();
}
publicclass JdProgrammerimplements IProgrammer{
@Override
public String program() {
//TODO Auto-generated method stub
return"写高效代码";
}
}
publicclass QjdCookerimplements ICooker{
@Override
public String cook() {
//TODO Auto-generated method stub
return"烤制美味烤鸭";
}
}
测试类:
publicclass Test {
publicstaticvoid main(String[] args) {
//TODO Auto-generated method stub
ICooker qjdCooker =new QjdCooker();
IProgrammer jdProgrammer =new JdProgrammer();
System.out.println(qjdCooker.cook());
System.out.println(jdProgrammer.program());
}
}
方案二:使用适配器设计模式
单个适配器demo
源代码:
定义的工人的接口和实体类 worker包中的代码
publicinterface ICooker {
public String cook();
}
publicinterface IProgrammer {
public String program();
}
publicclass JdProgrammerimplements IProgrammer{
@Override
public String program() {
//TODO Auto-generated method stub
return"编写高效代码";
}
}
publicclass QjdCookerimplements ICooker{
@Override
public String cook() {
//TODO Auto-generated method stub
return"烤制美味烤鸭";
}
}
定义适配器的接口和实体类:【adapter包中的代码】
publicinterface IWorkerAdapter {
String work(Object worker);
}
publicclass WorkerAdapterimplements IWorkerAdapter {
String workContent="";
@Override
public String work(Object worker) {
//TODO Auto-generated method stub
//如果传来的对象是厨师则
if(workerinstanceof ICooker){
workContent = ((ICooker)worker).cook();
}if(workerinstanceof IProgrammer){
workContent = ((IProgrammer)worker).program();
}
returnworkContent;
}
}
测试类:
publicclass Test {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
//TODO Auto-generated method stub
ICooker qjdCooker=new QjdCooker();
IProgrammer jdProgrammer =new JdProgrammer();
Object [] workers ={qjdCooker,jdProgrammer};
IWorkerAdapter adapter =new WorkerAdapter();
for (Object worker : workers) {
System.out.println(adapter.work(worker));
}
}
}
运行效果:
多个适配器demo
定义的工人的接口和实体类 worker包中的代码【worker包中的代码】
publicinterface ICooker {
public String cook();
}
publicinterface IProgrammer {
public String program();
}
publicclass JdProgrammerimplements IProgrammer{
@Override
public String program() {
//TODO Auto-generated method stub
return"编写高效代码";
}
}
publicclass QjdCookerimplements ICooker{
@Override
public String cook() {
//TODO Auto-generated method stub
return"烤制美味烤鸭";
}
}
定义适配器接口【总的适配器】
publicinterface IWorkerAdapter {
String work(Object worker);
//判断传递过来的适配器是否支持
boolean supports(Object worker);
}
定义各个适配器
publicclass CookerAdapterimplements IWorkerAdapter {
@Override
public String work(Object worker) {
//TODO Auto-generated method stub
return ((ICooker)worker).cook();
}
@Override
publicboolean supports(Object worker) {
//TODO Auto-generated method stub
return (workerinstanceof ICooker);
}
}
publicclass ProgrammerAdapterimplements IWorkerAdapter {
@Override
public String work(Object worker) {
//TODO Auto-generated method stub
return ((IProgrammer)worker).program();
}
@Override
publicboolean supports(Object worker) {
//TODO Auto-generated method stub
return (workerinstanceof IProgrammer);
}
}
测试类:
publicclass Test {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
//TODO Auto-generated method stub
ICooker qjdCooker =new QjdCooker();
IProgrammer jdProgrammer =new JdProgrammer();
Object[] workers = { qjdCooker, jdProgrammer };
for (Object worker : workers) {
//循环遍历每一个工种,让每一个工种对象在适配器中逐个进行匹配
IWorkerAdapter adapter =getAdapter(worker);
System.out.println(adapter.work(worker));
}
}
//根据worker获取相应的适配器对象
privatestaticIWorkerAdapter getAdapter(Object worker) {
//TODO Auto-generated method stub
//拿到所有适配器
List<IWorkerAdapter> adapters =getAllAdapters();
for (IWorkerAdapter adapter : adapters) {
if (adapter.supports(worker)) {
return adapter;
}
}
returnnull;
}
//获取所有的适配器
privatestatic List<IWorkerAdapter> getAllAdapters() {
//TODO Auto-generated method stub
List<IWorkerAdapter> adapters =new ArrayList<>();
adapters.add(new CookerAdapter());
adapters.add(new ProgrammerAdapter());
return adapters;
}
}
缺省适配器模式
定义:是由适配器模式简化而来的,省略了适配器模式中目标接口,也就是源接口和目标接口相同,源接口为接口,目标接口为类