时间:2015-05-20 来源:

Java适配器模式(Adapter模式)【编程语言】

适配器模式定义:将两个不兼容的类纠合在一起使用,div+css+js切图属于结构型模式承接网站前端,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份.

为何使用适配器模式

我们经常碰到要将两个没有关系的类组合在一起使用,页面div重构第一解决方案是:修改各自类的接口psd切图html,但是如果我们没有源代码,psd切图html或者web外包,在这两种接口之间创建一个混合接口(混血儿).

如何使用适配器模式

实现Adapter方式网页切图制作,其实"think in Java"的"类再生"一节中已经提到,div页面有两种方式:组合(composition)和继承(inheritance),

假设我们要打桩,div+css+js切图有两种类:方形桩 圆形桩.
public class SquarePeg{
 public void insert(String str){
  System.out.println("SquarePeg insert():"+str);
 }
}

public class RoundPeg{
 public void insertIntohole(String msg){
  System.out.println("RoundPeg insertIntoHole():"+msg);
    }
}
现在有一个应用承接网站前端,需要既打方形桩,承接网站前端又打圆形桩.那么我们需要将这两个没有关系的类综合应用psd切图html,假设RoundPeg我们没有源代码,承接网页制作或源代码我们不想修改web外包,那么我们使用Adapter来实现这个应用:
public class PegAdapter extends SquarePeg{
 private RoundPeg roundPeg;
 public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)
 public void insert(String str){ roundPeg.insertIntoHole(str);}
}
在上面代码中,web外包RoundPeg属于Adaptee,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配.实际上这是将组合方法(composition)和继承(inheritance)方法综合运用.

PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,网页重构报价生成RoundPeg的对象roundPeg,再重载父类insert()方法.从这里,承接网站前端你也了解使用new生成对象和使用extends继承生成对象的不同psd切图html,前者无需对原来的类修改,psd切图html甚至无需要知道其内部结构和源代码.

如果你有些Java使用的经验web外包,已经发现,div切图排版这种模式经常使用.

进一步使用

上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承,手机页面切图排版即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承,div+css+js切图但是我们可以实现(implements)两个接口(interface):
  • public interface IRoundPeg{
     public void insertIntoHole(String msg);
    }
  • public interface ISquarePeg{
     public void insert(String str);
    }

下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别,页面div重构和上面的没什么区别.
public class SquarePeg implements ISquarePeg{
 public void insert(String str){
  System.out.println("SquarePeg insert():"+str);
 }
}

public class RoundPeg implements IRoundPeg{
 public void insertIntohole(String msg){
  System.out.println("RoundPeg insertIntoHole():"+msg);
 }
}
下面是新的PegAdapter,ISquarePeg{
 private RoundPeg roundPeg;
 private SquarePeg squarePeg;

 // 构造方法
 public PegAdapter(RoundPeg peg){this.roundPeg=peg;}
 // 构造方法
 public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)

 public void insert(String str){ roundPeg.insertIntoHole(str);}
}
还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个.使用Reflection技术,web外包可以动态的发现类中的Public方法.

适配器模式
 概述
    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.
 适用性
    1.你想使用一个已经存在的类web外包,而它的接口不符合你的需求.

    2.你想创建一个可以复用的类,web外包该类可以与其他不相关的类或不可预见的类(即那些接口
      可能不一定兼容的类)协同工作.

    3.(仅适用于对象Adapter)你想使用一些已经存在的子类网页切图制作,但是不可能对每一个都进行
      子类化以匹配它们的接口.对象适配器可以适配它的父类接口.
			
 参与者
    1.Target
      定义Client使用的与特定领域相关的接口.

    2.Client
      与符合Target接口的对象协同.

    3.Adaptee
      定义一个已经存在的接口,div页面这个接口需要适配.

    4.Adapter
      对Adaptee的接口与Target接口进行适配
 类图
 例子
Target
public interface Target {

    void adapteeMethod();
    
    void adapterMethod();
}
Adaptee
public class Adaptee {

    public void adapteeMethod() {
        System.out.println("Adaptee method!");
    }
}
Adapter
public class Adapter implements Target {

    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

	public void adapteeMethod() {
		adaptee.adapteeMethod();
	}

	public void adapterMethod() {
		System.out.println("Adapter method!");
    }
}
Client
public class Test {

    public static void main(String[] args) {
        Target target = new Adapter(new Adaptee());
        target.adapteeMethod();
        
        target.adapterMethod();
    }
}
result
Adaptee method!
Adapter method!

点击次数:3727
作者:

其它web前端开发资讯

IO流之文件读写操作 【移动开发】2018年01月19日记亚马逊AWS(AmazonWebServices)免费EC2申请【互联网】2018年01月19日Android热更新——非侵入AOP框架 【编程语言】2018年01月19日Java编程最差实践【编程语言】2018年01月19日学习笔记:TheLog(我所读过的最好的一篇分布式技术文章) 【综合】2018年01月19日【c语言】不使用+-*计算两个数的和【综合】2018年01月19日有序二叉树链式存储结构1——插入与遍历【移动开发】2018年01月19日微软将推出简化版Office2010?2018年01月19日Swift教程_swift常见问题(五)_完美解决Cannotoverride'dealloc'异常 【Web前端】2018年01月19日J2SE知识点归纳笔记(七)---JavaIOPart1:File类与RandomAccessFile类 【移动开发】2018年01月19日进度条(js实现) 【编程语言】2018年01月19日LeetCodeSqrt(x)【编程语言】2018年01月19日使用O(n)的时间复杂度合并两个数组【数据库】2018年01月19日89.GrayCode(回溯)【编程语言】2018年01月19日指针两个要素,彻底理解指针的概念 【移动开发】2018年01月19日POJ3368Frequentvalues(RMQ求区间出现最多次数的数字的次数) 【综合】2018年01月19日
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日Oracle自动备份脚本 【互联网】2015年03月09日猫猫学IOS(十五)UI之曾经大热的打砖块小游戏 【架构设计】2015年04月03日SparkAPI编程动手实战-06-对搜狗日志文件深入实战操作 【编程语言】2015年01月30日通过AJAX的JS、JQuery两种方式解析XML示例介绍2014年01月29日把握linux内核设计(七):内核定时器和定时执行 【编程语言】2015年07月30日使用zTree和json构建简单树节点 【互联网】2014年11月10日菜鸟nginx源码剖析数据结构篇(六)哈希表ngx_hash_t(上) 【架构设计】2014年11月06日【练习题】atoi和itoa函数的实现 【综合】2015年06月24日请解决问题,而不是创造点子 ,,2016年06月23日Delayqueue(python实现) 【移动开发】2015年07月08日可自定义oem的萝卜家园GhostXP新春装机版V200801下载2014年01月29日javascript跨浏览器的事件系统2014年01月29日android子线程中更新UI的方法【架构设计】2015年03月16日hdu_5551_多校联赛5_1009 【架构设计】2015年08月05日透明行间距的TextView【移动开发】2015年01月13日74cms骑士人才系统v3.5.1正式版【移动开发】2015年02月04日程序网络工作组ASP站点管理员(ASPAdmin)V1.02下载2014年01月29日如何在NGUI上显示粒子特效 【综合】2015年03月19日Sqoop介绍及使用 【移动开发】2014年12月09日【BZOJ1011】【HNOI2008】遥远的行星 【Web前端】2015年01月19日WPFCommend命令 【研发管理】2015年04月13日浅谈前后端分离与实践(一)2017年10月11日传GooglePropeller将在数周内发布 ,,2016年06月23日递归算法——BOXFRACTAL盒分形(POJ2083) 【移动开发】2015年05月11日设计模式之Proxy模式(笔记) 【编程语言】2015年06月05日linux下的一些常识【综合】2014年12月10日.NET常用功能和代码小结2014年01月29日HDU1988&ZOJ2991FlippingBurnedPancakes(数学啊+模拟) 【综合】2015年01月29日多媒体播放器Banshee2.2发布 ,,2016年06月29日WCF获取数据对象时,报“基础连接已经关闭:接收时发生错误” 【综合】2015年05月05日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)