精华内容
下载资源
问答
  • 网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。  Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter...
  • 什么是适配器模式适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容...

    什么是适配器模式?

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
    这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

    图示

    比如我们当前有两个播放器的方法,一个是比较低级只能播放MP3的类AudioPlayer,一个是比较高级的可以播放MP4和VLC的类。
    在这里插入图片描述
    那么问题来了,我想要只调用一个类,想播放哪个,选择哪个就行。不用调用那么多,需要怎么做呢。增加一个中间类(MediaAdapter),集成视频播放的功能,让一个方法去调用。而这个类实现的就是适配器模式
    这样一来,所有的播放方法都集中在了AudioPlayer中,只需要传入文件属性就可以使用所有的播放方法
    在这里插入图片描述

    实现

    步骤1:实现高级播放功能
    (PS: 写这个代码的时候感觉有些熟悉,翻了一下之前的代码,果然是抽象工厂中步骤3模式)

    /**
     * 高级播放视频功能接口
     */
    public interface AdvancedMediaPlayer {
        void playVlc(String fileName);
        void playMp4(String fileName);
    }
    
    /**
     * MP4播放功能实现
     */
    public class Mp4Player implements AdvancedMediaPlayer{
        @Override
        public void playVlc(String fileName) {
            //不用写内容
        }
    
        @Override
        public void playMp4(String fileName) {
            System.out.println("Playing mp4 file. Name:"+ fileName);
        }
    }
    
    /**
     * 实现VLC播放视频功能
     */
    public class VlcPlayer implements AdvancedMediaPlayer{
        @Override
        public void playVlc(String fileName) {
            System.out.println("Playing vlc file. Name:"+ fileName);
        }
    
        @Override
        public void playMp4(String fileName) {
            //不用写内容
        }
    }
    

    步骤2:实现普通媒体播放,并集成高级媒体播放功能

    /**
     * 普通媒体播放接口
     */
    public interface MediaPlayer {
        void play(String audioType, String fileName);
    }
    
    /**
     * 适配器,本身不实现功能
     * 只做格式判断,用来传递类型
     */
    public class MediaAdapter implements MediaPlayer{
    
        private AdvancedMediaPlayer advancedMediaPlayer;
    
        public MediaAdapter(String audioType){
            if(audioType.equalsIgnoreCase("vlc")){
                advancedMediaPlayer = new VlcPlayer();
            }else if(audioType.equalsIgnoreCase("mp4")){
                advancedMediaPlayer = new Mp4Player();
            }
        }
    
        @Override
        public void play(String audioType, String fileName) {
            if(audioType.equalsIgnoreCase("vlc")){
                advancedMediaPlayer.playVlc(fileName);
            }else if(audioType.equalsIgnoreCase("mp4")){
                advancedMediaPlayer.playMp4(fileName);
            }
        }
    }
    
    /**
     * 实现原本的mp3播放功能,并且调用适配器中的高级播放功能
     */
    public class AudioPlayer implements MediaPlayer{
        MediaAdapter mediaAdapter;
        
        @Override
        public void play(String audioType, String fileName) {
    
            //播放MP3音乐文件的内置支持
            if(audioType.equalsIgnoreCase("mp3")){
                System.out.println("Playing mp3 file. Name: "+ fileName);
            }
    
            //mediaAdapter 提供了播放其他文件格式的支持
            else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4") ){
                mediaAdapter = new MediaAdapter(audioType);
                mediaAdapter.play(audioType, fileName);
            }//其他格式
            else{
                System.out.println("Invalid media. "+ audioType +" format not supported");
            }
    
        }
    }
    

    步骤3:播放不同格式文件

    public class AdapterPatternDemo {
        public static void main(String[] args) {
            AudioPlayer audioPlayer = new AudioPlayer();
    
            audioPlayer.play("mp3", "beyond the horizon.mp3");
            audioPlayer.play("mp4", "alone.mp4");
            audioPlayer.play("vlc", "far far away.vlc");
            audioPlayer.play("avi", "mind me.avi");
        }
    }
    
    

    输出结果

    Playing mp3 file. Name: beyond the horizon.mp3
    Playing mp4 file. Name:alone.mp4
    Playing vlc file. Name:far far away.vlc
    Invalid media. avi format not supported
    
    展开全文
  • 适配器模式 现实中,港版欧版老式手机充电器:有一个转接头。就是适配器。 适配器的根本特性:把两个不能工作的类型通过中间的转接头,两个可以一起工作。 再举个例子:我们有一个手机,一个充电器,充电器和...

    适配器模式

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    现实中,港版欧版老式手机充电器:有一个转接头。就是适配器。
    在这里插入图片描述

    适配器的根本特性:把两个不能工作的类型通过中间的转接头,两个可以一起工作。

    再举个例子:我们有一个手机,一个充电器,充电器和手机不能一起工作,我们有适配线,插起来,使得手机和充电器可以一起工作。

    适配器模式代码

    在这里插入图片描述
    在这里插入图片描述

    如何在程序改变很少的情况下,调动适配者的方法。

    第一种方法:对象模式的方法。
    增加代码。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    第二种方法:类型适配方案
    在这里插入图片描述
    在这里插入图片描述

    调动适配者的快速请求
    在这里插入图片描述
    假如还有其他适配者
    在这里插入图片描述
    在这里插入图片描述

    我的用户可以选择适配者。

    我们应该怎么去做?
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    适配者接口名不同。

    适配器模式总结

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 目录大讲设计模式的...所以我直接告诉你怎么来使用设计模式,保证你可以直接在项目中使用,使用场景在项目中我需要使用缓存, redis集群, redis, 本地缓存,于是我就有三种选择,为了能方便的创建者三种缓存机制,

    目录

    大讲设计模式的文章有很多,可以实际用起来却从来没有人讲过,我一直都坚信,必须是 自己见过猪跑,才会想起怎么去吃猪肉,很多文章都只是讲一个例子,但是实际生产中,很多人是无法根据例子直接可以在实际开发中使用的,所以我直接告诉你怎么来使用设计模式,保证你可以直接在项目中使用,

    使用场景

    在项目中我需要使用缓存, redis集群, redis, 本地缓存,于是我就有三种选择,为了能方便的创建者三种缓存机制,于是我需要一个工厂类,用于生产这三中 缓存的 容器,
    于是 很自然我就 想到了 工厂模式,直接使用最简单的工厂模式

    1.
    public class RedisCache{ 
      方法: get()  set()
              remove()  hash()  exsits()
    }
      两者方法都差不多,因为使用时 差不多
    2. public class LocalCache{
       方法: get()  set()
              remove()  hash()  exsits()
    
    }
    
    3。工厂类
    public class Cache {
    
    
     static {
            Properties properties = new Properties();
    
            try {
                InputStream fs = Cache .class.getClassLoader().getResourceAsStream("cache.properties");
                properties.load(fs);
    
                if (properties.getString("handle").equalsIgnoreCase("redis")) {
                    cache = new RedisCache(Redis.class);
                } else if (properties.getString("handle").equalsIgnoreCase("rediscluster")) {
                    cache = new RedisCache(RedisCluster.class);
                } else {
                    cache = new LocalCache();
                }
            } catch (IOException e) {
                e.printStackTrace();
                cache = new LocalCache();
            }
            properties.clear();
        }
    
    }
    

    **工厂类中 我直接使用, static 块,当加载这个类时,就会执行这个初始化的操作,通过配置文件控制,到底选择哪一种的 缓存机制,

    其次 这三种缓存机制,肯定有很多方法是一样的,于是我需要 把他们抽象出来,于是我需要一个 interface 被 RedisCache+LocalCache 实现,

    public interface CacheAdapter {
    
        Boolean exists(String type, Object key);
    
        void set(String type, Object key, Object value);
        }
    
    于是 RedisCache+LocalCache需要 implements CacheAdapter 
    
    

    再者 由于 我使用了 Redis + RedisCluster
    这两者不管有多少个链接 肯定是只能有一套链接配置,所以我这里需要使用到了单例模式

    public class RedisConfig { 
        private static RedisConfig redisConfig = null;
       //  懒汉式:
        public static RedisConfig getInstance() {
            if (redisConfig == null) {
                redisConfig = new RedisConfig();
            }
    
            return redisConfig;
        }
     }

    这两者 又是 相当于 同工厂生产出的不同 车,但是车的 各种属性和方法又是一样的,于是 我需要给他们 抽象出一个 父类 ,

    1public abstract class RedisBase {
        public abstract void set(byte[] key, byte[] value);
    
        public abstract void set(byte[] key, byte[] value, int seconds); 
    }
    2public class Redis extends RedisBase {
    
        private String auth = null;
        private List<JedisShardInfo> redisHosts = new ArrayList<>();
    
        private static ShardedJedisPool pool = null;
    
    3public class RedisCluster extends RedisBase {
    
        private String auth = null;
        private JedisCluster jedisCluster;
        private Set<HostAndPort> jedisClusterNodes = new HashSet<>();
        private int timeout = 0;
    
        public RedisCluster() {
            if (jedisCluster == null) {
                JedisPoolConfig config = getConfig();
                jedisCluster = new JedisCluster(jedisClusterNodes, timeout, config);
            }
        }
    

    继续探究,我使用 Cache这个工厂
    由于我将 RedisCache+LocalCache 做了抽象
    于是 我这里使用了 对象的适配器模式+简单工厂模式结合

    public class Cache {
    
        private static CacheAdapter cache; 
    
        static {
            Properties properties = new Properties();
    
            try {
                InputStream fs = RedisCache.class.getClassLoader().getResourceAsStream("cache.properties");
                properties.load(fs);
    
                if (properties.getString("handle").equalsIgnoreCase("redis")) {
                    cache = new RedisCache(Redis.class);
                } else if (properties.getString("handle").equalsIgnoreCase("rediscluster")) {
                    cache = new RedisCache(RedisCluster.class);
                } else {
                    cache = new LocalCache();
                }
            } catch (IOException e) {
                e.printStackTrace();
                cache = new LocalCache();
            }
            properties.clear();
        }
    
        public static void set(String type, Object key, Object value) {
            cache.set(type, key, value);
        }
    

    详细代码参考:http://download.csdn.net/download/sinat_27639721/10139171

    展开全文
  • 怎么保证redis与Mysql的数据一致性 见你写了个加随机数预防缓存雪崩,解释一下 未改进和改进后的Jmter测试性能对比 3、Redis 为什么选择Redis作为缓存? 为什么Redis的性能十分的高? 说一下单进程、单线程的Redis...

    美团面试经历(还原最真实的4面)

    美团一面:

    1、自我介绍

    2、聊项目相关

    • 介绍项目
    • 怎么保证redis与Mysql的数据一致性
    • 见你写了个加随机数预防缓存雪崩,解释一下
    • 未改进和改进后的Jmter测试性能对比

    3、Redis

    • 为什么选择Redis作为缓存?
    • 为什么Redis的性能十分的高?
    • 说一下单进程、单线程的Redis和你平时写的多线程程序的对比
    • 如何保证Redis的高可用?(哨兵、持久化策略RDB、AOF)
    • 解释一下哨兵、RDB、AOF
    • 主从一致性
    • Redis数据淘汰策略
    • 能说一下分布式事务吗?
    • setnx是事务吗?

    4、Mysql

    • 解释一下事务
    • 讲一讲事务隔离级别
    • 为什么使用B+树作为索引
    • 聚簇索引和非聚簇索引的区别

    5、Java

    • Java是如何保证其安全性的
    • 刚见你说了Java 内存泄漏问题,解释一下什么情况下会出现
    • 说一下BIO、NIO、AIO

    6、手撕算法

    • 一个数组找出出现次数最多的一个数,如果多个数出现的次数相同则输出第一个
    • 生产者消费者(一对一)

    7、其它

    • 平时怎么学习的
    • 有什么需要问的吗?

    美团二面:

    1、手撕算法

    • 10个多线程保证 i从0加到10 (差点翻车,主线程忙等另外10个线程完结
    • 反转链表
    • 上台阶(n=80)

    2、操作系统

    • 常用的linux命令说一下
    • 操作系统中的信号 和 信号量有什么关系
    • epoll 和 Selector 有什么区别?

    3、计算机网络

    • 说一下拥塞控制

    4、数据结构

    • 说一下红黑树,你平时用的技术哪里用到了它?
    • 哈希表怎么处理冲突?

    5、项目相关

    • 把项目放到服务器上运行的时候有没有遇到什么问题?查看项目运行的状态怎么做?
    • spring 和 springboot的关系你是怎么理解的?
    • Spring IOC和AOP说一下你的理解
    • 为什么用消息队列?
    • 对于消息的重复消费你有什么设计方案吗?

    美团三面:

    • 你怎么学的Java啊?
    • 设计模式了解吗?单例讲一下,懒汉饿汉double-check,怎么实现。策略模式,外观模式,适配器模式,装饰器模式,分别讲一下
    • 联合索引什么时候不会触发索引?
    • AOP了解么,有什么好处,如何使用,怎么实现的?
    • 支付宝到银行的转账业务怎么实现?
    • redis实现分布式锁
    • 三台机器集群,按不同权重访问,怎么做?

    美团四面(hr):

    • 先介绍一下你自己吧
    • 说一下四种IO模型
    • 平时怎么去学习的?
    • 为什么你说学习了要去实践?
    • 说一下的最大的优点和缺点
    • 举一下你缺点的例子
    • 想象一下你几十年后是怎样的生活?
    • 你觉得最痛苦的一段时间
    • 对你影响最大的一件事情
    • 在安排活动的过程中有没有发生什么冲突?
    • 你有什么崇拜的人吗?
    • 你有什么想问的?

    最后

    总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

    有需要这些学习笔记资料的朋友注意啦:戳这里即可免费领取

    还有更多学习笔记面试资料也分享如下(都可免费领取):

    都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”

    😕/docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**

    还有更多学习笔记面试资料也分享如下(都可免费领取):

    [外链图片转存中…(img-zFCSt1Ae-1624212981152)]

    展开全文
  • 在MyWindow 类肯定要覆写全部方法,但是现在希望可以根据自己的需要选择性的覆盖某些方法。...适配器设计模式:只要接口和抽象类相互使用,就叫适配器模式。 1. interfaceWindow{ 2. public void o
  • 桥接模式无法联网问题描述解决方案 ...在 Vmware 的 虚拟网络编辑器(Virtual Network Editor) 中点击 还原默认设置 后,vMnet0 不见了,并且手动添加选择桥接模式后会报错:没有未桥接的主机网络适配器,无法将网络更改
  • 如果现在有一个Iterable类,你想要添加一种或多种在... 一种解决方案是所谓的adapter方法的惯用法,"适配器"部分来自于设计模式,因为你必须提供特定接口以满足foreach语句,当你有一个接口并需要另一个接口时,编写adapt...
  • 设计模式

    2021-04-05 12:01:56
    文章目录UML 基本概念----建模语言设计模式基本概念简单工厂模式工作方法模式单例模式代理模式外观模式适配器模式模板模式策略模式命令模式观察者模式装饰模式 UML 基本概念----建模语言 1、软件建模概述 1、1 什么...
  • 1、linux虚拟机中连接方式选择NAT模式 查看虚拟机的IP、子网掩码和默认网关如下: 2、本地启动对应的网卡,我这里是VMnet8,根据各自电脑的情况选择,然后选择VMnet8的属性,手动输入和linux虚拟机ip在同一...
  • 之前虚拟机都是可以通过桥接模式上网的,这两天新装的虚拟机不管怎么设置,都无法通过桥接模式连接上网络。 原因和解决办法: 尝试了很多种办法,最后发现是腾讯的全民wifi的问题。 因为全民wifi和无线键鼠有些冲突...
  • VMWARE桥接模式虚拟机无法上网

    万次阅读 2016-11-14 18:01:31
    之前虚拟机都是可以通过桥接模式上网的,这两天新装的虚拟机不管怎么设置,都无法通过桥接模式连接上网络。 原因和解决办法: 尝试了很多种办法,最后发现是腾讯的全民wifi的问题。  因为全民wifi和无线键鼠...
  • ADAPTER 适配器模式   适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给...
  • Vmware 10.0.1安装centos6.6桥接模式上网

    千次阅读 2016-09-12 10:57:04
    搭建学习环境。安装centos6.6系统,需要连接外...那么桥接的网卡是怎么选择的呢? 我的是win10系统 点击:打开网络和共享中心----更改适配器设置(查看到当前连接到的网卡) 二:在centos6.6系统写网卡配置文
  • 确认要启动的虚拟机的网络适配器类型是"NAT"模式,点击屏幕右下角,选择,选中"设置",出现如下图所示。 当然,如果你的虚拟机当前不是“NAT”模式,那么需要点击“网络适配器”,会弹出如下图所示...
  • C#23种设计模式

    2013-06-02 16:49:43
    从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我) 适配器(变压器)模式:把一个类的接口变换成客户端所...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    设计模式之 Adapter(适配器) 使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 ...
  • 适配器模式: 从而使原本因接口原因不 适配器模式 把一个类的接口变换成客户端所期待的另一种接口, 匹配而无法一起工作的两个类能够一起工作。 适配类可以根据参数返还一个合适的实例给客 户端。 7、BRIDGE —...
  • centos6无法上网怎么解决?

    千次阅读 2019-01-07 13:28:40
    昨天安装了centos6却无法上网,...打开虚拟机设置,点击网络适配器选择NAT模式,确定。如下: 修改etc/sysconfig/network-scripts/ifcfg-eth0网络配置文件。  查看文件命令:cat /etc/sysconfig/network-scri...
  • 今天在VMware搭了一个redis服务器,但是用redisdesktopmanager访问不了,redis的配置文件检查了没有问题,鼓捣了半天之后是因为VMware中设置的...4.在首页打开网络适配器选择自定义VMware8NET模式 5.查看IP地址 6.
  •  [hide] 解决方法:WiFi共享精灵启动界面--高级设置--共享模式选择选择正确模式),安卓系统的手机只可以使用无线AP WPA2模式(win7),IOS系统手机WPA2模式和WEP模式皆可使用。查看电脑右下角虚拟网卡(热点...
  • 适配器模式:(了解) 适配器类: 命名方式: XxxXxxAdaptor 解决了两个功能的协同工作。(苹果充电器和华为手机充电的问题) 扩展性强,成本低廉 使用场景: 不同的类需要配合完成...
  • 上不了原因无非就是DNS配置设置出现的问题 ...2、点击更改适配器设置 ...4、选中IPV4后选择使用下面的DNS服务器地址,首选IP输入 ...5、win+r进入管理员模式输入ipconfig/flushdns 最后就可以上网了,希望能帮助到你 ...
  • 网络适配器选择net连接模式 第二步 进入虚拟机点击右上角查看自己linux系统的名称,记住名字,下面会用到 第三步 在本地主机cmd窗口下输入输入ipconfig/all,查看主机DNS服务器地址(IPV4也一样),记住地址 ...
  • 在vmware5.0上,NAT方式的选择可以在linux启动后,在vmware的右下角处找到有关网卡、硬盘、光驱等设备,然后点击网卡,出现“网络适配器”对话框,其中的网络连接方式选择“NAT,用来共享主机的IP”,点击“确定”。...
  • 在使用Ubuntu自带vi编辑器的时候遇到了很多问题,比如键盘使用非常不友好,写程序代码时...在操作之前需要关闭虚拟机,关闭后打开虚拟机设置,找到网络适配器选择 自定义(U):特定虚拟网络 选择VMnet8(NAT模式...
  • Java看书5

    2021-02-04 16:28:58
    常用的设计模式有工厂模式、单例模式、适配器模式、享元模式以及观察者模式。 工厂模式: 主要解决:主要解决接口选择的问题。 何时使用:我们明确地计划不同条件下创建不同实例时。 如何解决:让其子类实现工厂接口...
  • 3)列表中点击选择VMnet8,下面选择NAT模式,配置子网IP,子网掩码,点击NAT设置按钮,配置网关IP,点击DHCP按钮,配置网段。配置的值是怎么来的呢? 本地电脑win+R,输入cmd 打开命令窗口,输入ipconfig,在展示的...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

怎么选择适配器模式