千峰Java教程:066. 适配器设计模式

本文介绍了适配器模式,它能将一个类的接口转换成客户期望的另一个接口,使原本不兼容的类可一起工作,还举例插线盘、电脑电源适配器说明。通过代码展示其使用,还提及适配器模式符合面向接口编程等OO设计原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

17、适配器模式

适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

可以看上面的图片,比如第一个类跟第三个类,一个是方的一个是圆的,没法怼进去,这时候就需要中间那个类,用来连接方形和圆形。在生活中也有这样的例子,如插线盘,还有电脑的电源适配器,把电源三角口转换成计算机的圆口插到电脑上。

我们先来一串代码:

public class Demo1
{
	public static void main(String[] args)
	{
		IPowerA powerA = new PowerAImpl();//建立一个子类
		work(powerA);
	}
	//用IPowerA接口的时候下面设计一个静态方法
	public static void work(IPowerA a)
	{
		System.out.println("正在连接...");
		a.insert();
		System.out.println("工作结束。");
	}//写完这个方法,就要在主函数中用这个方法了
}

interface IPowerA//设定一个电源A的接口
{
	public void insert();//插入电源A
}
class PowerAImpl implements IPowerA
{
	public void insert()
	{
		System.out.println("电源A开始工作");
	}
}
/*
结果:
正在连接...
电源A开始工作
工作结束。
*/

我们看上面的代码,他是这样子的:

现在需求发生了变化,适配器有点像补救的办法一样,要把这个图象换成第一个图象,中间加一个适配器

public class Demo1
{
	public static void main(String[] args)
	{
		IPowerA powerA = new PowerAImpl();//建立一个子类
		//work(powerA);
		
		/*IPowerB powerB = new PowerBImpl();
		work(powerB);注释的这两行是没有办法用的,因为work里面的参数必须是IPowerA,现在建立的是IPowerB类型的*/
		
		//这样来:
		IPowerB powerB = new PowerBImpl();//先建立一个IPowerB类
		Adapter adapter = new Adapter(powerB);//调用Adapter类,把电源B转化成电源A
		work(adapter);//最后调用
	}
	//用IPowerA接口的时候下面设计一个静态方法
	public static void work(IPowerA a)
	{
		System.out.println("正在连接...");
		a.insert();
		System.out.println("工作结束。");
	}//写完这个方法,就要在主函数中用这个方法了
}

interface IPowerA//设定一个电源A的接口
{
	public void insert();//插入电源A
}
class PowerAImpl implements IPowerA
{
	public void insert()
	{
		System.out.println("电源A开始工作");
	}
}

interface IPowerB//那我们这时候添加一个B电源
{
	public void connet();
}
class PowerBImpl implements IPowerB
{
	public void connet()
	{
		System.out.println("电源B开始工作");
	}
}

class Adapter implements IPowerA//这里定义一个适配器,这个类是IPowerA的子类
{
	private IPowerB powerB;
	public Adapter(IPowerB powerB)//建立一个构造器
	{
		this.powerB = powerB;
	}
	public void insert()//这里把B转换成了A
	{
		powerB.connet();
	}
}
/*
结果:
正在连接...
电源B开始工作
工作结束。
*/

这样,就把B变成了A。此时A接口没有改变,B接口也没有改变(对修改关闭,对扩展开放)

 

还有一种用法:

public class Demo1
{
	public static void main(String[] args)
	{
		IAnimal dog = new Dog();
		dog.run();
	}
}

interface IAnimal//这时候我们新建一个接口,有唱、哭、跑、游泳四个方法
{
	public void sing();
	public void cry();
	public void run();
	public void swim();
}
class Dog implements IAnimal//继承IAnimal的时候,要把接口里的方法都继承下来,但可以不实现。我们关注跑这个方法
{
	public void sing(){}
	public void cry(){}
	public void run()
	{
		System.out.println("我是疯狗,疯狂地跑");
	}
	public void swim(){}
}
/*
结果:
我是疯狗,疯狂地跑
*/

我们定义一个适配器,子类就不用implements IAnimal了

public class Demo1
{
	public static void main(String[] args)
	{
		IAnimalFunction dog = new Dog();//这里的IAnimal就要改成IAnimalFunction了
		dog.run();
	}
}

interface IAnimal//这时候我们新建一个接口,有唱、哭、跑、游泳四个方法
{
	public void sing();
	public void cry();
	public void run();
	public void swim();
}

abstract class IAnimalFunction//适配器
{
	public void sing(){}
	public void cry(){}
	public void run(){}
	public void swim(){}
}

class Dog extends IAnimalFunction//这个就变成了IAnimalFunction的子类,用来转接用,不用再加唱、哭、游泳的方法了
{
	public void run()
	{
		System.out.println("我是疯狗,疯狂地跑");
	}
}
/*
结果:
我是疯狗,疯狂地跑
*/

OO设计原则:

1、面向接口编程(面向抽象编程)

2、封装变化

3、多用组合,少用继承

4、对修改关闭,对扩展开放

基于C2000 DSP的电力电子、电机驱动和数字滤波器的仿真模型构建及其C代码实现方法。首先,在MATLAB/Simulink环境中创建电力电子系统的仿真模型,如三相逆变器,重点讨论了PWM生成模块中死区时间的设置及其对输出波形的影响。接着,深入探讨了C2000 DSP内部各关键模块(如ADC、DAC、PWM定时器)的具体配置步骤,特别是EPWM模块采用上下计数模式以确保对称波形的生成。此外,还讲解了数字滤波器的设计流程,从MATLAB中的参数设定到最终转换为适用于嵌入式系统的高效C代码。文中强调了硬件在环(HIL)和支持快速原型设计(RCP)的重要性,并分享了一些实际项目中常见的陷阱及解决方案,如PCB布局不当导致的ADC采样异常等问题。最后,针对中断服务程序(ISR)提出了优化建议,避免因ISR执行时间过长而引起的系统不稳定现象。 适合人群:从事电力电子、电机控制系统开发的技术人员,尤其是那些希望深入了解C2000 DSP应用细节的研发工程师。 使用场景及目标:①掌握利用MATLAB/Simulink进行电力电子设备仿真的技巧;②学会正确配置C2000 DSP的各项外设资源;③能够独立完成从理论设计到实际产品落地全过程中的各个环节,包括但不限于数字滤波器设计、PWM信号生成、ADC采样同步等。 其他说明:文中提供了大量实用的代码片段和技术提示,帮助读者更好地理解和实践相关知识点。同时,也提到了一些常见错误案例,有助于开发者规避潜在风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值