zoukankan      html  css  js  c++  java
  • 设计模式---结构型模式之适配器模式(Adapter Pattern)

    • 适配器模式定义

        将一个类的接口,转换成客户期望的另外一个接口。适配器让原本接口不兼容的类可以合作无间。

        适配器模式主要有两种类型:对象适配器和类适配器。

        在详细解释这两种类型时,解释部分重要角色。生活中使用的笔记本电脑,都有电源适配器,这个电源适配器的作用就是将标准电压220V交流电转变为低压直流电,供电脑充电的一种装置。这个装置便是适配器模式中的适配器角色,而标准电压220V交流电便是电源(我们也可以简称为适配者对象),笔记本通过电源适配器,可以获取到适合自己使用的低压直流电,而不需要更改厂商的API,这就是适配器作用最大的地方。

    • 对象适配器 

        该种类型主要使用组合方式实现,适配器对象内部使用组合方式调用被适配者对象。 

    package adapterpattern;
    /**
     * 220V电压提供者
     * @author Administrator
     */
    public class Adaptee {
        /**
         * 提供220V标准电压
         * @return
         */
        public int provideStandardVol(){
            return 220;
        }
    }
    View Code
    package adapterpattern;
    
    /**
     * 电源适配器目标接口,可以适配多种不同标准的笔记本
     * @author Administrator
     *
     */
    public interface Target {
        public int getFitnessVol();
    }
    View Code
    package adapterpattern;
    
    /**
     * 电源适配器的实现
     * @author Administrator
     */
    public class ObjcetTypeAdaptor implements Target{
        Adaptee adaptee;
        public ObjcetTypeAdaptor(Adaptee adaptee){
            this.adaptee = adaptee;
        }
        /**
         * 获取笔记本所需要的标准电压
         * @return
         */
        public int getFitnessVol(){
            int tmpVol = adaptee.provideStandardVol();
            System.out.println("获取标准电压:[" + tmpVol + "V]");
            System.out.println("Adaptor准备转换成适配电压");
            //此处为简单示例  TODO
            tmpVol = 19;
            System.out.println("Adaptor转换成适配电压[" + tmpVol + "V]");
            return tmpVol;
            
        }
    }
    View Code
    • 类适配器

        该种类型主要使用继承方式实现。适配器对象通过继承来调用被适配器对象方法。

    package adapterpattern;
    
    
    public class ClassTypeAdaptor extends Adaptee implements Target{
        
        /**
         * 获取笔记本所需要的标准电压
         * @return
         */
        public int getFitnessVol() {
            int tmpVol = provideStandardVol();
            System.out.println("获取标准电压:[" + tmpVol + "V]");
            System.out.println("Adaptor准备转换成适配电压");
            //此处为简单示例  TODO
            tmpVol = 19;
            System.out.println("Adaptor转换成适配电压[" + tmpVol + "V]");
            return tmpVol;
        }
    }
    View Code
    package adapterpattern;
    
    
    /**
     * 笔记本对象
     * @author Administrator
     *
     */
    public class Computer {
        private Target target;
        
        public Computer(Target target){
            this.target = target;
        }
        
        public void working(){
            if(null != target && 0 != target.getFitnessVol()){
                System.out.println("已插电源适配器,准备工作ing。。。");
            }else{
                System.out.println("未插电源适配器或电源适配器损坏,无法工作");
            }
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            //初始化一台标准220V电压
            Adaptee adaptee = new Adaptee();
            System.out.println("--------------对象适配器分割线开始-------------");
            //声明一个电源适配器
            Target adaptor1 = new ObjcetTypeAdaptor(adaptee);
            //开始构造一台电脑
            Computer computer1 = new Computer(adaptor1);
            computer1.working();
            System.out.println("笔记本1构造完毕,可以启动。。。。");
            System.out.println("--------------对象适配器分割线结束-------------");
            System.out.println("--------------类适配器分割线开始--------------");
            
            Target adaptor2 = new ClassTypeAdaptor();
            Computer computer2 = new Computer(adaptor2);
            computer2.working();
            System.out.println("笔记本2构造完毕,可以启动。。。。");
            System.out.println("--------------类适配器分割线结束--------------");
        }
    }
    
    /**
     * 输出:
     *    --------------对象适配器分割线开始-------------
     *    获取标准电压:[220V]
     *    Adaptor准备转换成适配电压
     *    Adaptor转换成适配电压[19V]
     *  已插电源适配器,准备工作ing。。。
     *  笔记本1构造完毕,可以启动。。。。
     *  --------------对象适配器分割线结束-------------
     *  --------------类适配器分割线开始--------------
     *  获取标准电压:[220V]
     *  Adaptor准备转换成适配电压
     *  Adaptor转换成适配电压[19V]
     *  已插电源适配器,准备工作ing。。。
     *  笔记本2构造完毕,可以启动。。。。
     *  --------------类适配器分割线结束--------------
     */
    View Code
    • 两种类型适配器的比较

       通过以上两个例子:将适合笔记本低压直流电目标类和标准高压交流电的适配者类解耦,通过引入适配器类来改造适配者类,而无需修改适配者类代码。

       类适配器模式中类是适配者类的子类,适配器类可以通过重写来构造新的方法,灵活性更强,但是也具有一定局限性:对于不支持多重继承的语言,只能单继承。

       对象适配器模式中适配器类通过组合方式来调用适配者类,可以适配多个适配者类。该类型与类适配器模式相比,不能改变适配者的方法。

  • 相关阅读:
    Appium环境搭建-精简版
    Capability配置简介
    Appium简介
    MonkeyRunner 综合实践
    怎么将织梦图集模型编辑器改为文章编辑器?
    dedecms调用日期格式化形式大全
    让织梦内容页arclist标签的当前文章标题加亮显示
    DedeCMS中channelartlist自增参数global.itemindex
    织梦中在线显示pdf文件的方法
    如何修改DEDECMS文章标题长度
  • 原文地址:https://www.cnblogs.com/mjs154/p/7326562.html
Copyright © 2011-2022 走看看