• Java设计模式概述之结构型模式(适配器模式)


    结构型模式清单:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。

    其中,适配器模式、装饰模式、享元模式、代理模式适用场景较多,须重点掌握。

    一、适配器模式


    适配器模式分为类适配器模式对象适配器模式缺省适配器模式

    适配器模式思想原理很简单。举个简单的例子:笔记本电脑充电。笔记本电脑充电的过程涉及三个元件:笔记本、电源适配器、插座。大家可以思考为什么有电源适配器。

    首先,插座并不知晓笔记本充电时的额定功率的,因此,需要一个电源适配器,来达到笔记本充电时的额定功率。电源适配器是智能的,一方是220V插座电流流入,另一方是笔记本额定电流输出至笔记本。因此,适配器担任了一个重要的中介人角色。

    1、类适配器模式

    首先来看一下流程图。

    这里写图片描述

    Interface是接口,接口中定义了两个方法:run1、run2。Adapter是适配器类,Adaptee是被适配的类。

    现在提出一个需求:Adaptee类只需要run2这一方法。

    因此,Adapter就要协助Adaptee屏蔽掉run1这一方法。

    有人会纳闷为什么要叫做“屏蔽”。事实上,直接继承接口,必须实现所有的方法。你不需要run1方法,你就要想办法屏蔽。

    如何屏蔽run1方法?

    上代码:

    class Adapter{
        public void run1(){
            System.out.println("run1");
        }
    }
    
    class Adaptee extends Adapter implements C{
        public void run2() {
            System.out.println("B's running");
        }
    }
    
    interface Interface{
        void run1();
        void run2();
    }

    首先在Adapter中定义run1方法。class Adaptee extends Adapter implements C这句很关键。Adapter实现Interface接口,Adaptee继承Adapter类,又因为Adapter已经实现了run1方法,留给Adaptee实现的方法就只有run2了。这样,就达到了我们想要的目的:Adaptee类实现run2方法,不实现run1方法。

    2、对象适配器模式

    我们先来回顾一下类适配器模式是怎样写的:
    class Adaptee extends Adapter implements C
    Adapter是以的形式来适配的。

    试想一下某些场景,如果摆在你面前是许多许多个适配器,你觉得用类适配器模式方便吗?

    不方便。

    对象适配器对比类适配器最大优势就是动态装载适配器。也就是说你想用哪个适配器都可以通过适配器的实例对象来使用。

    上代码:

    interface Interface{
        public void run1();
        public void run2();
    }
    
    class Adapter{
        public void run1(){
            System.out.println("run1方法");
        }
    }
    
    class Adaptee implements Interface{
        private Adapter adapter;
        public Adaptee(Adapter adapter){
            this.adapter = adapter;
        }
        public void run1() {
            this.adapter.run1();
        }
        public void run2() {
            System.out.println("Adaptee实现run2方法");
        }
    }

    很显然,我们可以通过Adaptee的构造函数将Adapter的实例对象注入Adaptee中,利用Adapter的run1方法来适配Interface接口中的run1方法。

    3、缺省适配器模式

    Earpods不兼容Andriod系统,嗯,Earpods压根就没对Andriod机提供适配功能。

    因此,市场上出现了很多iOS、Andriod通用的耳机,都能与之适配。

    缺省适配器属于类适配器的一种。是类适配器的特殊形式。缺省适配器实现接口中的所有方法,每一个方法都是空的,嗯,like this…”public void balabla(){}“。因此,被适配的对象只需继承缺省适配器就能使用或重写自己想要的方法。

    上代码!

    class iPhone extends Earphone{
        public void iOS(){
            System.out.println("iPhone");
        }
    }
    
    class Galaxy extends Earphone{
        public void Andriod(){
            System.out.println("Galaxy");
        }
    }
    
    class Earphone implements Interface{
        public void iOS() {
        }
        public void Andriod() {
        }
    }
    
    interface Interface{
        void iOS();
        void Andriod();
    }

    Tips:Earphone(Adapter)、iPhone(Adaptee)、Galaxy(Adaptee)

  • 相关阅读:
    CDM业务单据,表体单价列赋值所需要注意的问题
    用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用
    用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值
    用友CDM系统期初导入商品资料经验
    SSIS典型应用场景分析
    sql2000执行sql2005导出的数据脚本时出现“提示含有超过64K限度的行”(转)
    将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML
    winform 根据NAME查找控件
    Nginx服务配置编写
    Nginx安装部署实例
  • 原文地址:https://www.cnblogs.com/wanxi/p/6476242.html
Copyright © 2020-2023  润新知