首页 / 设计模式 / java设计模式-09适配器模式
java设计模式-09适配器模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java设计模式-09适配器模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3593字,纯文字阅读大概需要6分钟。
内容图文
定义:
- 将某个类的接口转成客户端期望的另外一个接口表示,主要目的是兼容性
- 使用起来有点像多重集成机制, 利用接口的特性, 把一些零散类组织到一起, 成为一个新的类来实现调用, 并且看起来像是对一个类的操作. 实际上, 适配器模式更过的是强调对代码的组织, 而不是功能的实现
角色:
- Target: 目标接口类, 客户所期待的接口, 目标可以是具体的或者抽象的类, 也可以是接口
- Adaptee: 需要适配的类
- Adapter: 通过包装一个需要的支配器对象, 把原来的接口转换成目标接口
优点:
- 系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
- 更好的复用性
- 更好的扩展性
- 在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
缺点:
- 过多的使用适配器,会让系统非常零乱,不易整体进行把握。
- 比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构
实现方式:
1、类适配:将220V的点转化为5V的电给手机充电
- 类适配器 java是单继承,所以类适配器需要继承是一个缺点,因为这要求目标必须是接口有一定的局限性
- 因为是继承,也可以去重写,灵活度高一点 但是违反里氏替换
- 以类给到,在Adapter里,就是将src当做类,继承
public class test3 {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
/*
电压=220伏
电压为5V,可以充电
*/
}
}
//适配接口
interface Ivoltage5V {
int output5V();
}
//手机类
class Phone {
public void charging(Ivoltage5V voltage5V) {
int i = voltage5V.output5V();
if (i == 5) {
System.out.println("电压为5V,可以充电");
} else if (i < 5) {
System.out.println("电压低于5V,可以充电,但是很慢");
} else {
System.out.println("电压太大手机炸了");
}
}
}
//被适配的类
class Voltage220V {
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏");
return src;
}
}
//适配器
class VoltageAdapter extends Voltage220V implements Ivoltage5V {
@Override
public int output5V() {
int srcV = output220V();
int dstV = srcV / 44;
return dstV;
}
}
2、对象适配
- 对象适配 和类适配器相同,只是将累聚合到目标类中 适配器模式中常用的一种
- 使用构造器,初始化的时候放到new一个实例
- 以对象给到,在Adapter里,将src作为一个对象,持有
代码
package com.example.demo;
public class test3 {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
//适配接口
interface Ivoltage5V {
int output5V();
}
//手机类
class Phone {
public void charging(Ivoltage5V voltage5V) {
int i = voltage5V.output5V();
if (i == 5) {
System.out.println("电压为5V,可以充电");
} else if (i < 5) {
System.out.println("电压低于5V,可以充电,但是很慢");
} else {
System.out.println("电压太大手机炸了");
}
}
}
//被适配的类
class Voltage220V {
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏");
return src;
}
}
//适配器
class VoltageAdapter implements Ivoltage5V {
private Voltage220V voltage220V; // 关联关系-聚合
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int srcV = voltage220V.output220V();
int dstV = srcV / 44;
return dstV;
}
}
3、接口适配
- 以接口给到,在Adapter里,将src作为一个接口,实现
- 不需要实现所有方法时,可以设计一个抽象类实现接口为改接口中每个方法提供一个默认实(空方法)那么该抽象类的子类可有选择的覆盖某些方法来实现需求
- 适用于接口不想使用所有方法的情况
- 违反了迪米特法则
public class test4 {
public static void main(String[] args) {
AbsAdapter absAdapter =new AbsAdapter(){
public void m1(){///默认实现
System.out.println("使用M1了");
}
};
absAdapter.m1();
}
}
interface Interface4 {
void m1();
void m2();
void m3();
void m4();
}
abstract class AbsAdapter implements Interface4{
public void m1(){///默认实现
}
public void m2(){
}
public void m3(){
}
public void m4(){
}
}
内容总结
以上是互联网集市为您收集整理的java设计模式-09适配器模式全部内容,希望文章能够帮你解决java设计模式-09适配器模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。