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();
        }
    }

    测试结果

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

  • 相关阅读:
    使用PRTG和panabit结合定位网络阻塞的来源
    jQuery实现全选、反选、删除
    ThinkPHP 5接阿里云短信接口
    《存在与时间》读书笔记(三)
    《存在与时间》读书笔记(二)
    自觉原理第十三章自觉情欲之殇
    【原创】自觉原理第十八章红绿灯下的寂静
    自觉原理第十四章欲之殇痛
    追逐文化答案的青春曲上
    自觉与【转载】《大念住经》原经文【中】
  • 原文地址:https://www.cnblogs.com/oeleven/p/10549817.html
Copyright © 2011-2022 走看看