首页 > 其他分享 >07 Adapter 模式 - Class Adapter

07 Adapter 模式 - Class Adapter

时间:2023-06-01 15:07:55浏览次数:50  
标签:介面 Java 07 继承 Adapter C++ Class public


Design Pattern: Adapter 模式 - Class Adapter

Adapter模式的另一种作法是Class Adapter模式,在这个模式下,Adapter直接继承Adaptee(要引进的新类别),以拥有当中的成员及方法,在C++中的话可以这么作:

07 Adapter 模式 - Class Adapter_一对一


 C++中可以多重继承,但在Java中不行,所以在Java中若要采用Class Adapter,必须作点修改,一方面继承Adaptee,一方面实作Target的介面:

07 Adapter 模式 - Class Adapter_一对一_02


 代码的实现是这样的:

public class Adapter extends Adaptee implements Target {
    // ....
}

 

当然,这必须您原先的Target定义了共同的介面,所以Class Adapter在Java中适用的场合较少,事实上,也比较建议使用Object Adapter,这样的Adapter模式比较有弹性,例如,您可以在Adapter上加上个setter,以随时可以抽换Adaptee。

在Java中,Class Adapter的一个应用场合是达到多重继承的效果,您一定在很多时候听别人说,介面(interface)可以达到多重继承的效果,这是怎么回事?

其实要讨论这个问题,首先您对于C++中多重继承要先有认识,新手看了书说介面可以达到多重继承,切莫人云亦云,尤其是没有学过C++的新手们,如果您对 于C++多重继承想要有所认识,请先看看 多 重继承(一)与 多 重继承(二)。

Java不能多重继承,但为何说Java中可以使用介面(interface)来达到多重继承的效果,首先效果之一,就如 多 重继承(二) 中描述的“ 多重继承时通常其中一个基底类别作为private实作体,而其它的用以表现完全的抽象介面。”,在Java中这个效果可以使用介面来达到,介面此时所扮 演的即 多 重继承(二) 中的抽象类别,一个完全的抽象介面,这个效果的达成方式,如 介 面(interface)型态 中所介绍的,您可以直接对应这两个主题中的程式实作来了解,了解Java中如何使用介面(interface)来达到C++中所谓多重继承的“一种”效 果。

来看看另一个情况。

如果有SomeClass类别与OtherClass类别,您想要SomeAndOther类别可以同时拥有SomeClass类别与 OtherClass类别中已定义好的操作,并可以进行多型操作,在C++中可以用多重继承来达到,但在Java中显然的无法使用多重继承,怎么办?您可 以在设计上先绕个弯,先使用两个介面分别定义好SomeClass与OtherClass两个类别的公开方法,例如:

public interface ISome {
    public void doSome();
}

public interface IOther {
    public void doOther();
}

 

接着让SomeClass与OtherClass分别实作两个介面:

public class SomeClass implements ISome {
    public void doSome() {
        ....
    }
}

public class OtherClass implements IOther {
    public void doOther() {
        ....
    }
}

 

SomeAndOther如何同时拥有两个SomeClass与OtherClass类别已定义好的操作?并可以多型操作?SomeAndOther可以 继承其中之一,并拥有其中之一,例如:

public class SomeAndOther extends SomeClass implements IOther {
    private IOther other = new OtherClass();

    public void doOther() {
        other.doOther();
    }
}

 虽不满意,但至少解决了目前的问题,当然这边只是其中一例,毕竟C++是C++,Java是Java,两者语法并不是一对一的关系,视实际需求还可以变化 一下。


标签:介面,Java,07,继承,Adapter,C++,Class,public
From: https://blog.51cto.com/u_8400305/6394349

相关文章

  • GDB021BE05 HIEE300766R0005确保保护电气装置和人员免受直接和间接接触
    GDB021BE05HIEE300766R0005确保保护电气装置和人员免受直接和间接接触GDB021BE05HIEE300766R0005GDB021BE05HIEE300766R0005 面板保护继电器-漏电继电器(ELR)、接地故障继电器(EFR)和缺相继电器(PFR)在制造配电板时,必须有除断路器以外的一些保护方法,这些保护方法可......
  • IDEA中slf4j和logback冲突,快速排除(LoggerFactory is not a Logback LoggerContext but
    pom文件中右击  ctrl+f输入点击定位 选中shift+delet,直接排除  或者手动输入排除 ......
  • 启动HBase时提示SLF4J: Class path contains multiple SLF4J bindings的解决方法
    启动hbase报错:“SLF4J:ClasspathcontainsmultipleSLF4Jbindings.”解决方法cd/home/opt/hbase-2.2.3/lib/client-facing-thirdpartymvslf4j-log4j12-1.7.25.jarslf4j-log4j12-1.7.25-copy修改了hbase中的文件名,保留了hadoop的,这个会有问题,一个当启动hbase的reg会报错这......
  • Luogu P1007 独木桥
    题目描述link思路找到独木桥的中间位置,最少时间考虑在端点左侧的,向左走,在端点右侧的向右走.最多时间考虑在端点左侧的向右走,在端点右侧的向左走.最少时间即为最优情况下最多的时间,最多时间即为最差情况下的最多时间Code#include<cstdio>#include<algorithm>......
  • java.lang.ClassCastException: com.alibaba.fastjson2.JSONArray cannot be cast to
    是这样的,今天跟着写springboot项目的时候,前端登录的时候报403错误。检查了半天,是后端的问题报错代码: 第二句报错提示如下 说是JSONArray不能转String,但我这也不是JSONArry转String而是Object转String啊。网上搜了半天,用了好多种方法也没什么用最后索性死马当活马医,让它......
  • Vue07-Axios
    Axiosaxios是一个网络请求相关的库。axios:ajaxi/osystem使用axios编写的网络请求代码,可以运行在浏览器端,也可以在Node环境中运行。01.支持的请求方式axios(config)axios.request(config)axios.get(url[,config])axios.delete(url[,config])axios.head......
  • 1107 Social Clusters
    题目:Whenregisteronasocialnetwork,youarealwaysaskedtospecifyyourhobbiesinordertofindsomepotentialfriendswiththesamehobbies.A socialcluster isasetofpeoplewhohavesomeoftheirhobbiesincommon.Youaresupposedtofindallt......
  • vue中v-bind使用三目运算符绑定class
    <template><div><!--外边框的样式--><div:class="projectStatus===2?outlineDelay:outline"@click="clickProject(userProjectId)"><!--延期--><divv-if="projectStatus===2"......
  • 关于mysql 创建索引报错 1071 specified key was too long ;max key length is 3027
    另一种张表也是相同的字段创建索引却能成功,在网上查了一些资料。后来发现是两张表字段都用的varchar类型,不过能成功建索引的表设置的长度是50,而不能成功的表里设置的255,修改字符长度就能成功建索引了。关于varchar(50)和varchar(255)的区别:https://dba.stackexchange.com/questio......
  • GZ075 云计算应用赛题第1套
    2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷1某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,选择国内主流公有云......