zoukankan      html  css  js  c++  java
  • 白话适配器模式,通俗易懂

    肥宅很喜欢听音乐,有一天他在湖边一边听音乐一边踩单车,听得正嗨,一不小心旁边有个人穿过,肥宅一个刹车,结果自己用了多年的肾5掉进湖里了。肥宅赶紧捞起自己的肾5,发现已经用不了,肥宅这下心疼死了。
    过了几天,肾7出了,肥宅忍一忍,用自己存了很久的钱买了台肾7。肥宅并没了解过肾7有什么改变,结果想用自己以前的耳机,发现居然肾7没有耳机圆孔,这下怎么办,怎么插下去。肥宅赶紧找手机店的老板,沟通一番,原来肾7没有耳机孔了,这下怎么办,两个口不匹配,这下怎么办,原来苹果出了一个转换器,买一个转换器就可以听歌了,肥宅无奈之下,又花钱买了一个转换器。

    没有耳机圆孔的iphone7

    只能插入到圆孔的耳机

    有线耳机听歌需要经过lightning口

    新出的适配器

    好了,讲了一长段故事,其实重点讲的就是适配器模式。当接口不匹配的时候怎么办,耳机口和lightning口不匹配,于是适配器出现了,可以插入lightning口,又有耳机插入的圆孔(实现了旧接口,又组合了新接口),适配器模式讲的就是这个意思。下面看看代码。

    
    public class IPhone7 {
    	//iphone7有lightning口,没有听歌用的圆孔
    	public Lightning lightning;
    	public void setLightning(Lightning lightning)
    	{
    		this.lightning=lightning;
    	}
    	//听歌只能用lightning口
    	public void listenMusic()
    	{
    		lightning.listenMusic();
    	}
    }
    
    //要听歌除了无线必需要必须用lightning
    public interface Lightning {
    	void listenMusic();
    }
    
    //耳机圆孔
    public interface Circle {
    	void listenMusic();
    }
    
    //耳机插入到圆孔就能听歌
    public class Earphone implements Circle{
    
    	@Override
    	public void listenMusic() {
    		// TODO 自动生成的方法存根
    		System.out.println("肥宅用圆孔耳机听歌");
    	}
    
    }
    
    //适配器实现了lightning口,可以插入到lightning口
    public class Adapter implements Lightning{
    	//同时有耳机圆孔
    	public Circle circle;
    	public Adapter(Circle circle)
    	{
    		this.circle=circle;
    	}
    	@Override
    	public void listenMusic() {
    		// TODO 自动生成的方法存根
    		circle.listenMusic();
    	}
    	
    }
    
    public class 肥宅 {
    	public static void main(String[] args) {
    		//买了一个一台iphone7
    		IPhone7 iphone=new IPhone7();
    		//有一个插入到圆孔就可以听歌的旧耳机
    		Circle circle=new Earphone();
    		//买一个适配器,适配器上插上耳机
    		Adapter adpter=new Adapter(circle);
    		//在lightning口上插上买的适配器
    		iphone.setLightning(adpter);
    		//通过适配器实现了用lightning口听歌
    		iphone.listenMusic();
    	}
    }
    

    那么问题来了

    适配器模式有点亡羊补牢的意思?

    是的,我们一般不会刻意去使用适配器模式,适配器模式一般不会出现在设计阶段。

    有没有在设计的时候就用适配器模式?

    有的,当项目使用第三方接口的时候,我们没有必要根据他的接口去改变我们自己的接口,应用适配器就可以。

    设计模式好像很少用到?

    不要为了使用而使用,这样反而会过度设计,看哪种模式能帮助我们就行了,所以先了解设计模式,用到的时候才不会方恨少。

    我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/-new/p/6942456.html
Copyright © 2011-2022 走看看