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

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

    现在我们有一个电视的类,新版电视的开关接口和老版电视的开关是不一样的,客户想要接着用老版电视的开关模式来操作新版电视,这时候就能用适配器模式来解决这个问题。

    适配器模式可以分为对象适配器、类适配器和接口适配器三种,接下来先看看对象适配器,对象适配器是重新创建一个适配器类,实现了原先接口的方法,同时有一个新版电视对象,实现原先接口中的方法调用新版电视的方法。

    我们设计一个NewTVAdapter的对象,实现TV接口,然后去调用NewTV的方法,具体代码如下

    public interface TV {
    
        public void on();
    
        public void off();
    }
    TV
    public class OldTV implements TV {
    
        @Override
        public void on() {
            System.out.println("打开了老式电视!");
        }
    
        @Override
        public void off() {
            System.out.println("关闭了老式电视!");
        }
    }
    OldTV
    public class NewTV {
        public void onTV() {
            System.out.println("打开了新款电视!");
        }
    
        public void offTV() {
            System.out.println("关闭了新款电视!");
        }
    }
    NewTV
    public class NewTVAdapter implements TV {
    
        private NewTV newTV;
    
        public NewTVAdapter(NewTV newTV) {
            this.newTV = newTV;
        }
    
        @Override
        public void on() {
            newTV.onTV();
        }
    
        @Override
        public void off() {
            newTV.offTV();
        }
    }
    NewTVAdapter

    测试代码

    public static void main(String[] args) {
            TV tv1 = new OldTV();
            tv1.on();
            tv1.off();
    
            NewTV newTV = new NewTV();
            tv1 = new NewTVAdapter(newTV);
            tv1.on();
            tv1.off();
        }

    测试结果

    还有一种类适配器,创建一个适配器类,继承新版电视,同时实现老版开关的接口,接口方法里调用父类的开关方法

    其他代码一样,就是适配器代码有所改变

    public class NewTVAdapterClass extends NewTV implements TV {
    
        @Override
        public void on() {
            super.onTV();
        }
    
        @Override
        public void off() {
            super.offTV();
        }
    }
    NewTVAdapterClass

    测试代码

    public static void main(String[] args) {
            TV tv1 = new OldTV();
            tv1.on();
            tv1.off();
            
            tv1 = new NewTVAdapterClass();
            tv1.on();
            tv1.off();
        }

    测试结果

    还有一种接口适配器,它只有某一个或者某几个方法,对其他的方法并不关心。(当然作为一个电视,只有一个关闭功能显然不合理,这里只是做一个例子)

    代码如下

    public abstract class NewTVAdapterAbstract implements TV {
        @Override
        public void on() {
    
        }
    
        @Override
        public void off() {
    
        }
    }
    NewTVAdapterAbstract
    public class NewTV2 extends NewTVAdapterAbstract{
        @Override
        public void off() {
            System.out.println("新版的关闭方式!");
        }
    }
    NewTV2

    测试代码

    public static void main(String[] args) {
            TV tv1 = new OldTV();
            tv1.on();
            tv1.off();
    
            tv1 = new NewTV2();
            tv1.on();
            tv1.off();
        }
    }

    测试结果

    适配器模式将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构,增加了类的透明性和复用性,扩展性很好。

  • 相关阅读:
    python RabbitMQ gRPC 实践经验
    python 数据库实践经验
    python GUI相关
    angularjs中的$watch、$digest、$apply
    css选择器优先级
    angularjs基本理解
    如何编写符合web标准的XHTML文档
    跨域问题
    如何养成良好的书写代码习惯
    ie常见兼容问题
  • 原文地址:https://www.cnblogs.com/oeleven/p/10549817.html
Copyright © 2011-2022 走看看