设计模式--结构模式--适配者模式

一、基本概念

  1、适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。

  2、角色:

    A:Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。

    B:Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。

    C:Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,使二者产生联系。

    D:Client(客户端类) 测试使用。

  3、适配器分为对象适配,类适配。具体看代码

二、例子

  1、类适配器模式

    A:Adaptee(适配者类):

 1 package comm.pattern.struct.adapter;
 2
 3 /**
 4  *
 5  * @Title: IAppleAdaptee.java
 6  * @Package: comm.pattern.struct.adapter
 7  * @Description: 苹果充电器
 8  * @author yangzhancheng
 9  * @2020年3月18日:下午8:42:11
10  *
11  */
12 public class AppleAdaptee {
13
14     //充电线接口
15     public void apple(){
16         System.out.println("1.能给苹果手机充电...");
17     }
18 }

    B:Target(目标抽象类):

 1 package comm.pattern.struct.adapter;
 2
 3 /**
 4  *
 5  * @Title: IAndroidPhoneTarget.java
 6  * @Package: comm.pattern.struct.adapter
 7  * @Description: Target(目标抽象类)给所有手机充电
 8  * @author yangzhancheng
 9  * @2020年3月18日:下午8:29:12
10  *
11  */
12
13 public interface IPhoneTarget {
14
15     //给苹果充电
16     public void apple();
17
18     //给小米手机充电
19     public void mi();
20
21     //给华为手机充电
22     public void huwei();
23
24 }

    C:Adapter(适配器类):

 1 package comm.pattern.struct.adapter;
 2
 3 /**
 4  *
 5  * @Title: ApppleAdapter.java
 6  * @Package: comm.pattern.struct.adapter
 7  * @Description: 适配者
 8  * @author yangzhancheng
 9  * @2020年3月18日:下午8:49:39
10  *
11  */
12 public class PhoneAdapter extends AppleAdaptee implements IPhoneTarget{
13
14     //给苹果充电
15     public void apple(){
16         super.apple();
17     }
18
19     //给小米手机充电
20     public void mi(){
21         System.out.println("2.能给小米手机充电...");
22     }
23
24     //给华为手机充电
25     public void huwei(){
26         System.out.println("3.能给华为手机充电...");
27     }
28
29 }

    D:Client(客户端类) 测试使用。

 1 package comm.pattern.struct.adapter;
 2 /**
 3  *
 4  * @Title: Client.java
 5  * @Package: comm.pattern.struct.adapter
 6  * @Description: 客户端
 7  * @author yangzhancheng
 8  * @2020年3月18日:下午8:49:23
 9  *
10  */
11 public class Client {
12
13     public static void main(String[] args) {
14
15         IPhoneTarget apppleAdapter = new PhoneAdapter();
16         apppleAdapter.apple();
17         apppleAdapter.mi();
18         apppleAdapter.huwei();
19
20     }
21
22 }

运行结果

1.能给苹果手机充电...
2.能给小米手机充电...
3.能给华为手机充电...

  2、对象适配器模式

    A:Adaptee(适配者类):

 1 package comm.pattern.struct.adapter;
 2
 3 /**
 4  *
 5  * @Title: IAppleAdaptee.java
 6  * @Package: comm.pattern.struct.adapter
 7  * @Description: 苹果充电器
 8  * @author yangzhancheng
 9  * @2020年3月18日:下午8:42:11
10  *
11  */
12 public class AppleAdaptee {
13
14     //充电线接口
15     public void apple(){
16         System.out.println("1.能给苹果手机充电...");
17     }
18 }

    B:Target(目标抽象类):

 1 package comm.pattern.struct.adapter;
 2
 3 /**
 4  *
 5  * @Title: IAndroidPhoneTarget.java
 6  * @Package: comm.pattern.struct.adapter
 7  * @Description: Target(目标抽象类)给所有手机充电
 8  * @author yangzhancheng
 9  * @2020年3月18日:下午8:29:12
10  *
11  */
12
13 public interface IPhoneTarget {
14
15     //给苹果充电
16     public void apple();
17
18     //给小米手机充电
19     public void mi();
20
21     //给华为手机充电
22     public void huwei();
23
24 }

    C:Adapter(适配器类):

 1 package comm.pattern.struct.adapter;
 2
 3 /**
 4  *
 5  * @Title: ApppleAdapter.java
 6  * @Package: comm.pattern.struct.adapter
 7  * @Description: 适配者
 8  * @author yangzhancheng
 9  * @2020年3月18日:下午8:49:39
10  *
11  */
12 public class PhoneAdapterExt  implements IPhoneTarget{
13
14     private AppleAdaptee appleAdaptee;
15
16     public PhoneAdapterExt(AppleAdaptee appleAdaptee){
17         this.appleAdaptee = appleAdaptee;
18     }
19
20     //给苹果充电
21     public void apple(){
22         appleAdaptee.apple();
23     }
24
25     //给小米手机充电
26     public void mi(){
27         System.out.println("2.能给小米手机充电...");
28     }
29
30     //给华为手机充电
31     public void huwei(){
32         System.out.println("3.能给华为手机充电...");
33     }
34
35 }

    D:Client(客户端类) 测试使用:

 1 package comm.pattern.struct.adapter;
 2 /**
 3  *
 4  * @Title: Client.java
 5  * @Package: comm.pattern.struct.adapter
 6  * @Description: 客户端
 7  * @author yangzhancheng
 8  * @2020年3月18日:下午8:49:23
 9  *
10  */
11 public class Client {
12
13     public static void main(String[] args) {
14
15         IPhoneTarget apppleAdapterExt = new PhoneAdapterExt(new AppleAdaptee());
16         apppleAdapterExt.apple();
17         apppleAdapterExt.mi();
18         apppleAdapterExt.huwei();
19
20     }
21
22 }

运行结果

1.能给苹果手机充电...
2.能给小米手机充电...
3.能给华为手机充电...

三、总结。

后续补充。

原文地址:https://www.cnblogs.com/fating/p/12521156.html

时间: 2024-10-08 18:42:36

设计模式--结构模式--适配者模式的相关文章

iOS深色模式适配

不适配深色模式 直接在info新加一个字段 User Interface Style 设置值为 Light 适配深色模式 适配深色模式info里面的那个字段就不用添加了 但是需要在每个UIWindow,UIViewController,UIView里面增加下面的这个方法 -(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection 在这个方法里去判断和更改当前界面所有元素的颜色 我专门做了一个单例,把应用

设计模式(7)--适配式模式与外观模式

转换接口. 引入新原则: " 最少知识"原则   作用为 外观模式 面向对象的适配器:将一个接口转换成另一个接口,以符合客户的期望. 对象适配器  与  类适配器 OO原则:(1)封装变化 (2)多用组合,少用继承 (3)针对接口编程,不针对实现编程 (4)为交互对象之间的松耦合设计而努力 (5)类应该对扩展开放,对修改关闭.(6) 依赖抽象,不要依赖具体类.(7)只和朋友交流. OO模式: 适配器模式-:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无

设计模式之适配者模式——Java语言描述 | Amos H's blog

适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模糊属于结构性模式,它结合了两个独立接口的功能 概念阐述 使用适配器模式可以解决在软件系统中,将一些旧的类放入新环境中,但是新环境要求的接口旧的类不能满足的情况. 使用情形: 系统需要使用旧的类,但是此类的接口不符合系统的需要 需要建立一个可以重复使用的类,用于一些彼此之间没有太大关系的一些类 通过接口转换,将一个类插入到另一个类中 优点: 可以让任何两个没有关联的类一起运行 提高了类的复用 增加了类的透明度 灵活性好 缺点: 过多的使用

Java经典设计模式之七大结构型模式(附实例和详解)

博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没事做看看也是没有坏处的. 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:Java经典设计模式之五大创建模式(附实例和详解).

设计模式(十一):FACADE外观模式 -- 结构型模式

1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 2. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢? 3. 解决方案 外观模式:为子系统中的一组接口提供一个一致的界面,

设计模式(十三): Proxy代理模式 -- 结构型模式

  设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象

【转】设计模式(九)外观模式Facade(结构型)

设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 2. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢? 3. 解决方案 外观模

【转】设计模式(十一)代理模式Proxy(结构型)

设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接