適配器設計模式
定義:將某個類的接口轉換爲客戶所需要的類型,解決的問題是,使得原來由於接口不兼容而不能一起工作、不能統一管理的那些類可以在一起工作,可以進行統一管理。
需求:初始的工作是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;
}
}
缺省適配器模式
定義:是由適配器模式簡化而來的,省略了適配器模式中目標接口,也就是源接口和目標接口相同,源接口爲接口,目標接口爲類