java適配器設計模式

適配器設計模式

定義:將某個類的接口轉換爲客戶所需要的類型,解決的問題是,使得原來由於接口不兼容而不能一起工作、不能統一管理的那些類可以在一起工作,可以進行統一管理。

需求:初始的工作是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;

    }

}

缺省適配器模式

定義:是由適配器模式簡化而來的,省略了適配器模式中目標接口,也就是源接口和目標接口相同,源接口爲接口,目標接口爲類

 

發佈了17 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章