zl程序教程

您现在的位置是:首页 >  后端

当前栏目

适配器模式 adapter 结构型 设计模式(九)详解程序员

模式设计模式程序员 详解 适配器 结构型 Adapter
2023-06-13 09:20:19 时间
public interface TargetHongkongPanelInterface { public void offerHongKongElectricity(); package adapter; /**目标角色 Target 某个具体的港版插座面板 实现类 * 香港地区使用的插座面板,提供输出电流的功能 * @author noteless public class TargetHongkongPanel implements TargetHongkongPanelInterface{ @Override public void offerHongKongElectricity() { System.out.println("港版面板 提供电流"); }

大陆地区插座面板


public interface AdapteeChinaMainlandPanelInterface { public void offerChinaMainlandElectricity(); package adapter; /**被适配角色 Adaptee 某种具体类型的插座面板 实现类 * 大陆地区使用的插座面板,提供输出电流的功能 * @author noteless public class AdapteeChinaMainlandPanel implements AdapteeChinaMainlandPanelInterface{ @Override public void offerChinaMainlandElectricity() { System.out.println("国标面板 提供电流"); }
public void plugIn(TargetHongkongPanelInterface targetHongkongPanel) { targetHongkongPanel.offerHongKongElectricity(); * 测试主程序,港版插头 插入到适配器上 * 适配器插入到大陆面板上 public static void main(String ...args) { //港版插头 ClientHongKongSocket socket = new ClientHongKongSocket(); //大陆面板 AdapteeChinaMainlandPanel adapteeChinaMainlandPanel = new AdapteeChinaMainlandPanel(); //适配器 Adapter adapter = new Adapter(adapteeChinaMainlandPanel); //港版插头 插到 适配器上 socket.plugIn(adapter); }
* 实现目标角色 TargetHongkongPanelInterface * 组合使用被适配角色 AdapteeChinaMainlandPanelInterface * 将对目标角色的方法调用转换为被适配角色的方法调用 * @author noteless public class Adapter implements TargetHongkongPanelInterface{ private AdapteeChinaMainlandPanelInterface adapteeChinaMainlandPanel; Adapter(AdapteeChinaMainlandPanel adapteeChinaMainlandPanel){ this.adapteeChinaMainlandPanel = adapteeChinaMainlandPanel; @Override public void offerHongKongElectricity() { adapteeChinaMainlandPanel.offerChinaMainlandElectricity(); } 执行港版插头的测试main方法
注意:此处说的接口,并不是单纯的指Interface,而是指一切可以提供方法调用的类型,可能是接口也可能是类
想要把一个类的接口转换为客户希望的另外一个接口
必须要有输入输出,有目标  有源
所以作为一个适配器,必须要 一手拿着被适配者也就是源  另一手拿着的是目标
想要转变为目标,那么必须得同目标时一样的类型,  在oop中想要成为目标类型 要么继承 要么实现
想要拥有被适配者,要么继承,要么实现,要么就是关联(拥有一个对象)
三种方式可以理解为按照  拥有被适配者 的方式进行划分的
如果继承Adaptee,那么就是类 适配器
如果拥有一个Adaptee,也就是拥有一个Adaptee对象,那么就是对象 适配器
如果实现Adaptee,那么就是 接口适配器
在Java中不允许多继承,既然已经继承了Adaptee  ,那么就必须要求目标是一个接口(此处接口就是Interface)
而且,既然是继承被适配者类,那么,被适配者的子类拥有的方法和行为,他并不能拥有,也就是说不能适配被适配者的子类
同类适配器比较的话,显然,他不能对被适配者 原来的一些方法进行操作,只能进行使用,不过也无伤大雅,不算缺点
因为他是拥有一个被适配者类型的对象,那么,被适配者和他的子类显然都可以作为具体的对象传入
接口适配器
按照我们的描述,如果实现了被适配者 Adaptee  那么就是接口适配器
具体说来:
当不需要全部实现接口提供的方法时
可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法)
那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
它适用于一个接口不想使用其所有的方法的情况
package doubleadapter; 

public class Adapter implements TargetInterface,AdapteeInterface { 

private TargetInterface target; 

private AdapteeInterface adaptee; 

Adapter(TargetInterface target){ 

this.target = target; 

Adapter(AdapteeInterface adaptee){ 

this.adaptee = adaptee; 

@Override 

public void adapteeRequest() { 

target.targetRequest(); 

@Override 

public void targetRequest() { 

adaptee.adapteeRequest(); 

}
Client 客户端角色 Main方法就相当于Client 客户端角色
保留现有类所提供的服务,向客户提供接口,以满足客户的期望,也就是将现有接口转换为客户希望的另外的一个接口
// Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) package org.apache.commons.collections.iterators; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator;
public class EnumerationIterator implements Iterator { private Collection collection; private Enumeration enumeration; private Object last; public EnumerationIterator() { this((Enumeration)null, (Collection)null); public EnumerationIterator(Enumeration enumeration) { this(enumeration, (Collection)null); public EnumerationIterator(Enumeration enumeration, Collection collection) { this.enumeration = enumeration; this.collection = collection; this.last = null; public boolean hasNext() { return this.enumeration.hasMoreElements(); public Object next() { this.last = this.enumeration.nextElement(); return this.last; public void remove() { if (this.collection != null) { if (this.last != null) { this.collection.remove(this.last); } else { throw new IllegalStateException("next() must have been called for remove() to function"); } else { throw new UnsupportedOperationException("No Collection associated with this Iterator"); public Enumeration getEnumeration() { return this.enumeration; public void setEnumeration(Enumeration enumeration) { this.enumeration = enumeration; }