zoukankan      html  css  js  c++  java
  • Java设计模式(02--适配器模式)

    定义:适配器模式将一个类的接口,转换成客户期望的目标接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    适配器模式如下图所示,有4个角色构成,客户端、目标接口、适配器类Adapter、被适配类Adaptee。

    适配器模式实现方式分为组合实现方式(对象适配器)和继承实现方式(类适配器)

    对象适配器实现方式:把被适配类Adaptee作为对象通过适配器类Adapter构造方法传入,Adapter实现目标接口,修改目标接口(在具体实现方法中调用Adaptee对象的方法),这样就可以得到目标接口的对象。

    类适配器实现方式:适配器类Adapter  extends(继承) Adaptee类 implements(实现) 目标接口(Target interface),在目标接口实现方法中,用this调用父类(adaptee)的方法。

    组合模式:就是把被适配类作为一个对象组合到适配器类中,修改目标接口方法。
    其步骤:被适配器类通过适配器类构造方法传入作为其成员变量,Adapter实现目标Target接口,修改目标接口
    方法,客户端类通过Adapter类生成目标接口对象,有目标接口对象客户端就可以调用其他方法。

     (上图应该是单继承不兼容接口, Java是单继承的)

    只要是把不兼容,不匹配的装换为兼容的,我们都称之为适配器。适配器有很多变体如下图所示。

    实例:演示对象适配器和类适配器

    场景:我们有个笔记本(客户端)需要充电,但我们现在只有两相插座Adaptee,我们需要三相插座,因此我们需要用适配器Adapter把两相插头供电Adaptee转化为三相插头供电Target。

    三相插头供电接口(Target interface) ThreePlugIf

    package com.imooc.pattern.adapter;
    
    /**
     * @author zplogo
     * 三相插头接口
     */
    public interface ThreePlugIf {
        
        //使用三相电流供电
        public void powerWithThreePlug();
    }

    目前存在的两相插头供电类(Adaptee) GBTwoPlug

    package com.imooc.pattern.adapter;
    
    /**
     * @author zplogo
     * 国标二相电流插头
     */
    public class GBTwoPlug {
        
        //使用二相电流供电 
        public void powerWithTwo(){
            System.out.println("使用二相电流供电");
        }
    }

    组合的方式实现适配器(Adapter) TwoPlugAdapter

    package com.imooc.pattern.adapter;
    
    /**
     * @author zplogo
     * 这个类完成了实现目标接口,同时把被适配类组合到目标接口方法中
     */
    public class TwoPlugAdapter implements ThreePlugIf {
        
        private GBTwoPlug gbTwoPlug;
        
        public TwoPlugAdapter(GBTwoPlug twoPlug) {
            this.gbTwoPlug = twoPlug;
        }
        
        //重写实现接口的方法,把二相的供电能力包装成三相供电能力
        public void powerWithThreePlug() {
            System.out.println("通过转换");
            gbTwoPlug.powerWithTwo();
        }
    
    }

    继承的方式实现适配器(Adapter) TwoPlugAdapterExtends

    package com.imooc.pattern.adapter;
    
    /**
     * @author zplogo
     * 继承的方式实现适配器模式
     */
    public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf {
    
        public void powerWithThreePlug() {
            System.out.print("通过继承适配器类实现 ");
            this.powerWithTwo();
        }
    
    }

     客户端类(Client) NoteBook

    package com.imooc.pattern.adapter;
    
    /**
     * @author zplogo
     * 1)笔记本应该有三相插头这个属性,调用充电这个动作方法即可充电
     * 2)获得三相插头对象,需要由实现其接口的适配器类生成,适配器类需要修改其接口方法,
     * 把二相插头插头的供电能力融合到三相供电方法中。
     */
    public class NoteBook {
        
        private ThreePlugIf threePlugIf;
        
        public NoteBook(ThreePlugIf plug){
            this.threePlugIf = plug;
        }
        
        public void charge(){
            threePlugIf.powerWithThreePlug();
        }
    
        public static void main(String[] args) {
            GBTwoPlug gbTwoPlug = new GBTwoPlug();
            ThreePlugIf  threePlug = new TwoPlugAdapter(gbTwoPlug);
            NoteBook noteBook = new NoteBook(threePlug);
            noteBook.charge();
            
            //通过继承的方式实现适配器
            threePlug = new TwoPlugAdapterExtends();
            noteBook = new NoteBook(threePlug);
            noteBook.charge();
        }
    
    }
  • 相关阅读:
    button label textfield对齐 textview UI样式
    iOS真机测试
    Android学习
    CoreMontion加速计
    一些用xib加载主界面的过程
    英特尔公司
    CISC和RISC
    Terminating app due to uncaught exception 'NSGenericException' 类崩溃文章收集
    UICollectionView 介绍 <转>
    流媒件应用FreeStreamer 学习2
  • 原文地址:https://www.cnblogs.com/zplogo/p/6388394.html
Copyright © 2011-2022 走看看