适配器模式,共有两类适配器模式:
OOAD-设计模式-适配器模式
原创
©著作权归作者所有:来自51CTO博客作者wulianghuan的原创作品,请联系作者获取转载授权,否则将追究法律责任
对象适配器模式
-- 在这种适配器模式中,适配器容纳一个它我包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
类适配器模式
-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
编辑本段关于JAVA适配器的解释
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
实现方法
1.用一个抽象类继承已有的接口,并实现接口中所规定的所有方法,这些方法的实现可以都是“平庸”实现----空方法;
但此类中的方法是具体的方法,而不是抽象方法,
否则的话,在具体的子类中仍要实现所有的方法,这就失去了适配器本来的作用。 2.原本要继承接口的子类,
只继承1中的抽象类即可,并在其内部实现时,只对其感兴趣的方法进行实现。
注意事项
1.充当适配器角色的类就是:继承已有接口的抽象类 2.为什么要用抽象类: 此类是不要被实例化的。
而只充当适配器的角色,也就为其子类提供了一个共同的接口,
但其子类又可以将精力只集中在其感兴趣的地方。
适配器模式解析
你想使用一个已经存在的适配器模式,而他的接口不符合你的需求。你想创建一个可以复用的类,
该类可以与其他不相关的类或不可预见的类协同工作。你想使用一些已经已经存在的子类,
但是不可能对每一个都进行子类化已一匹配他们的接口,对象适配器可以适配他的父类接口。
适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的
,但是电脑后面的插孔却不能直接插到插线板上。 作者曾经遇到过一个ASP编程的难题,asp不是面向对象的,
但是却可以借鉴适配器模式解决问题。问题是这样的,在一个产品表(product)中的所有产品都有一个编号,
字段名字是bh,每个编号是唯一的,但却不是主键,表中使用一个自动增长的id作为主键。
在产品的详情页中使用传过来的参数id查询产品,而在另外的一个系统中也有一个同样的表,
需要访问详情页(已经由另外的一个程序员设计好,并且代码晦涩难懂),由于字段值是自动增长的,
两个表中的主键并不对应(在其中的一个系统中进行删除添加都会引起id的增长),在具体的实现中,
本人在有详情页的系统中添加了一个页面(adapter),接受传过来的产品编号bh,然后根据编号查找数据库得到相应产品的驻键id,
最后让页面跳转到详情页并传递一个id,
在另外的系统中只要得到产品的编号bh,并把bh作为参数传递到添加的页面(adapter)便可以得到正确的结果。
下面是一个小例子程序:
public interface UserInfo {
public String getMobiltPhone() ;
public String getHomePhone() ;
}
import java.util.Map;
public interface UserMessage {
public Map getContact();
}
public class UserInfoImp implements UserInfo {
private static void doPrint(Object obj) {
System.out.println(obj);
}
@Override
public String getHomePhone() {
// TODO Auto-generated method stub
doPrint("9090909090");
return new String("9090909090");
}
@Override
public String getMobiltPhone() {
// TODO Auto-generated method stub
doPrint("123456789");
return new String("123456789");
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserMessageImp implements UserMessage{
@Override
public Map getContact() {
// TODO Auto-generated method stub
Map contactMap = new HashMap();
contactMap.put("mobile", "89898989898989");
contactMap.put("home", "1234567");
return contactMap;
}
public static void doPrint( Object obj ){
System.out.println(obj);
}
}
import java.util.HashMap;
public class Adapter extends UserMessageImp implements UserInfo{
private HashMap map ;
public Adapter(){
map = (HashMap)super.getContact();
}
@Override
public String getHomePhone() {
// TODO Auto-generated method stub
doPrintln((String)map.get("home"));
return (String)map.get("home");
}
@Override
public String getMobiltPhone() {
// TODO Auto-generated method stub
doPrintln((String)map.get("mobile"));
return (String)map.get("mobile");
}
private static void doPrintln(Object obj){
System.out.println(obj);
}
}
public class Client {
public static void main(String[] args) {
UserInfo ui = new UserInfoImp();
ui.getHomePhone();
ui.getMobiltPhone();
Adapter a = new Adapter();
a.getHomePhone();
a.getMobiltPhone();
}
}
上一篇:OOAD-设计模式-原型模式
下一篇:OOAD-设计模式-模板模式
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
设计模式-适配器模式
设计模式-适配器模式
适配器模式 设计模式 -
设计模式-适配器模式
设计模式,适配器模式,
设计模式 适配器 模式