设计模式之适配器模式
来源:互联网 发布:孕 防辐射 知乎 编辑:程序博客网 时间:2024/06/14 16:46
如有转载,请申明:
转载至 http://blog.csdn.net/qq_35064774/article/details/52057962
1 什么是适配器模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
这很好理解。
假如你在美国买了一款电器回中国,这时候是不能直接插上插座就用的,因为美国的生活电压是110V,而中国的是220V,这时候需要一个220V转110V的适配器来转换电压。
同样的,在代码中,如果一个接口和目标接口不一致,但只能用目标接口时,就需要用到适配器。
2 怎么实现适配器模式
为了便于理解,还是以一个简单的问题为入口。
* 现有一个正方形Square类,有方法getSideLengthen
* 还有一个圆Round接口,有方法getRadius
* 要求取得正方形的半径
题意大概是有一个正方形的类,也就是现有接口getSideLengthen,但只能使用目标接口getRadius。这时候需要一个类来转换接口。
首先按要求写出正方形类
package com.ittianyu.adapter;public class Square {private float sideLengthen;public Square(float sideLengthen) {super();this.sideLengthen = sideLengthen;}public float getSideLengthen() {return sideLengthen;}}
然后是圆的接口
package com.ittianyu.adapter;public interface Round {float getRadius();}
接下来是适配器类
package com.ittianyu.adapter;public class SquareRoundAdapter implements Round{private Square square;public SquareRoundAdapter(Square square) {super();this.square = square;}@Overridepublic float getRadius() {return square.getSideLengthen() / 2;}}
简单分析一下这个类,它实现了圆的接口,也就是有了我们的目标方法。
然后再构造方法中,接收了一个正方形类。
在目标方法getRadius中,调用了正方形类的getSideLengthen方法完成适配。
还差最后一步,测试
package com.ittianyu.adapter;public class Test {public static void main(String[] args) {SquareRoundAdapter adapter = new SquareRoundAdapter(new Square(2.0f));System.out.println("半径为" + adapter.getRadius());}}
3 在什么情况下使用适配器模式
* 系统需要使用现有的类,而此类的接口不符合系统的需求。
* 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
4 适配器模式的优点和缺点
优点:
* 将目标类与适配者类解耦。
* 增加了类的透明性和复用性。
* 很强的灵活性和扩展性。
缺点:
* 在设计里,需要改变多个已有的子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式 之 适配器
- 设计模式 之 适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式 之 适配器模式
- 设计模式之适配器模式
- 设计模式之适配器模式
- 设计模式之适配器模式
- 设计模式之适配器模式
- 设计模式之适配器模式
- 设计模式之--适配器模式.
- java对数据库进行增删改查的封装(封装以后只要一句话就搞定对数据库的增删改查)
- 用Fragment实现微信Tab切换
- Mybatis中的foreach方法,批量插入和批量删除
- 面试题之java的理解
- 【笔记】关于网络编程的知识整理
- 设计模式之适配器模式
- Red and Black(DFS)
- windows 窗口创建,消息泵,对话框,控件常用API
- 1042. 字符统计(20)
- 为什么选择D语言译为中文语言
- Required field 'sessionHandle is unset !’
- 事件的传递和响应(响应者链条)
- Android VLC播放器二次开发——CPU类型检查+界面初始化
- 进程和线程的区别