设计模式之适配器模式(adaptor pattern)
2023-09-14 09:03:13 时间
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
比如我们去日本买了一个日本的电饭煲,但日本电压标准都是110V,而我们国家标准是220V,所以要想在中国用日本电饭煲,需要一个电源适配器。 比如我们有一个micro SD卡,如果我们想在笔记本上用,就需要一个读卡器做为适配器 JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 JAVA 中的 jdbc。 3 应用场景
系统需要使用现有的类,而此类的接口不符合系统的需要。 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
优点:
1. 可以让任何两个没有关联的类一起运行。
2. 提高了类的复用。
3. 增加了类的透明度。
4. 灵活性好。
缺点:
1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2. 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
我们就拿日本电饭煲的例子进行说明,日本电饭煲电源接口标准是110V电压,而中国标准电压接口是220V,所以要想在中国用日本电饭煲,需要一个电源转换器。
public class JP110VInterfaceImpl implements JP110VInterface { public void connect() { System.out.println("接通电源,开始工作....");
我们再定义中国220V电源接口和实现。
220V接口:
public interface CN220VInterface { public void connect();
220V接口实现:
public class CN220VInterfaceImpl implements CN220VInterface { public void connect() { System.out.println("接通电源,开始工作......");
要想在中国使用日本电饭煲,需要把电饭煲110v的电源接口适配成我们220V的电源接口,这就需要一个电源适配器:
/** * 为了能够适配定电饭煲110v电源接口,我们需要继承110v接口 * */ public class PowerAdaptor implements JP110VInterface { private CN220VInterface cn220VInterface;//用220V接口进行适配 PowerAdaptor(CN220VInterface cn220VInterface){ this.cn220VInterface=cn220VInterface; public void connect() { cn220VInterface.connect();
适配器继承的是要适配的接口,并持有对客户的接口的引用。
5.3 电饭煲下面正式开始啦,现在我们有一个日本电饭煲,用的是110v的电源接口:
public class ElectricCooker { private JP110VInterface jp110VInterface;//日本电饭煲,用的是日本110V标准电源接口 ElectricCooker(JP110VInterface jp110VInterface){ this.jp110VInterface=jp110VInterface; public void cook(){ jp110VInterface.connect();//接通电源 System.out.println("开始做饭......");
电饭煲用的是110V接口
5.4 电饭煲配合适配器工作测试类:
public class AdaptorTest { public static void main(String[] args) { CN220VInterface cn220VInterface=new CN220VInterfaceImpl();//中国的220V电源 PowerAdaptor adaptor=new PowerAdaptor(cn220VInterface);//电源适配器 ElectricCooker cooker=new ElectricCooker(adaptor);//使用110V接口的电饭煲 cooker.cook();//使用了适配器,在220V的环境下可以工作啦
适配器继承了110V接口,就可以用于日本电饭煲;适配器又持有220V接口的引用,就可以用220V进行工作。
运行结果:
接通电源,开始工作...... 开始做饭......
从零开始学设计模式(九):外观模式(Facade Pattern) 外观(Facade)模式又叫作门面模式,是一种为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部与其中子系统的通信必须通过一个统一的外观对象进行,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,使得这一子系统更加容易使用,提高了程序的可维护性。外观模式是一种对象结构型模式。
C#设计模式之八装饰模式(Decorator Pattern)【结构型】 原文:C#设计模式之八装饰模式(Decorator Pattern)【结构型】 一、引言 今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:Decorator Pattern。
C#设计模式(22)——访问者模式(Vistor Pattern) 原文:C#设计模式(22)——访问者模式(Vistor Pattern) 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景。在这篇博文中,我将为大家分享我对访问者模式的理解。
相关文章
- 设计模式(六)学习----组合模式
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
- 设计模式(四)——一文搞清楚三种工厂模式
- Java设计模式----观察者模式详解
- C#设计模式——迭代器模式(Iterator Pattern)
- 设计模式 -- 桥接模式(Bridge Pattern)
- 设计模式 -- 解释器模式(Interpreter Pattern)
- 【设计模式】服务定位器模式
- C++设计模式4--桥接模式--处理多维度的需求变化
- 「补课」进行时:设计模式(3)——和做菜一样简单的模版方法模式
- C#设计模式——生成器模式(Builder Pattern)
- C#设计模式——状态模式(State Pattern)
- C#设计模式——观察者模式(Observer Pattern)
- 设计模式 -- 亨元模式(FlyWeight Pattern)
- 不一样的适配器模式(设计模式三)
- Java设计模式之享元flyweight模式代码示例
- 设计模式-工厂模式-场景以及优缺点-目的就是应对变化 (国江面试回答的)
- Atitit.设计模式-----触发器模式 trigger 详解
- python 设计模式之单例模式 Singleton Pattern
- python 设计模式之桥接模式 Bridge Pattern
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
- C#设计模式之建造者模式
- 设计模式(Python语言)----责任链模式
- 设计模式python版(3)-工厂方法模式
- 设计模式---外观模式
- 【设计模式】如何在业务开发中使用适配器模式?
- 【设计模式】策略模式
- 23种类设计模式--1单例模式