我对适配器模式的理解

适配器模式通过变换接口使不兼容的类能够一起工作。分为类适配器(继承实现)和对象适配器(组合实现)。举例说明,在都市交通工具中,摩托车和汽车可以通过适配器与草原上的马、牛兼容。适配器模式适用于设计初期未考虑完全,需要扩展已有类的功能场景。

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

一.概念

适配器模式 把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。   适配器可以分为两类,一类是类的适配器模式(采用继承实现),一类是对象适配器(采用对象组合方式实现)。

二.举例子

假设现在在都市里有人物,交通工具。我们抽象出交通工具这个接口,然后有摩托车和汽车两个交通工具。当人来到草原上时,不仅可以用原来的交通工具,还可以用马、牛作为交通工具。但是一开始设计的时候马和牛只是一般的动物设计,那么这个时候得设计一个适配器了。

/**
 * 将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
 * 应用场景
 * 在以下各种情况下使用适配器模式:
 * 1.系统需要使用现有的类,而此类的接口不符合系统的需要。
 * 2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
 * 3.(对"对象适配器"而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
 */
public class AdapterTest {
	//公交工具接口
	public interface Riding {
		public void ride();
	}
	public class MotorBike implements Riding {
		@Override
		public void ride() {
			System.out.println("摩托车被骑了。。。");
		}
	}
	public class Car implements Riding {
		@Override
		public void ride() {
			System.out.println("小汽车被开了。。。");
		}
	}
	public class People {
		private Riding riding;
		public void setRiding(Riding riding) {
			this.riding = riding;
		}
		public void show() {
			if(null == this.riding) {
				System.out.println("没有坐骑");
			}else {
				this.riding.ride();
			}
		}
	}
	//动物接口
	public interface Animal {
		public void run();
	}
	public class Horse implements Animal {
		@Override
		public void run() {
			System.out.println("马儿跑啊跑啊。。");
		}
	}
	public class Cattle implements Animal {
		@Override
		public void run() {
			System.out.println("牛儿走呀走呀。。");
		}
	}
	//类适配器,需要单独给一个类马和牛做一个适配器,当类很多的时候,类适配器就不实用了。ps:实际开发中很少用
	public class RidingAdatperHorseClass extends Horse implements Riding {
		@Override
		public void ride() {
			super.run();
		}
	}
	//对象适配器
	public class RidingAdapterAnimal implements Riding {
		private Animal animal;
		public RidingAdapterAnimal(Animal animal) {
			this.animal = animal;
		}
		@Override
		public void ride() {
			this.animal.run();
		}
	}
	public static void main(String[] args) {
		People people = new AdapterTest().new People();
		people.setRiding(new AdapterTest().new MotorBike());
		people.show();
		people.setRiding(new AdapterTest().new Car());
		people.show();
		//使用类适配器
		people.setRiding(new AdapterTest().new RidingAdatperHorseClass());
		people.show();
		//使用对象适配器
		Horse horse = new AdapterTest().new Horse();
		people.setRiding(new AdapterTest().new RidingAdapterAnimal(horse));
		people.show();
		Cattle cattle = new AdapterTest().new  Cattle();
		people.setRiding(new AdapterTest().new RidingAdapterAnimal(cattle));
		people.show();
	}
}
运行结果:



三.总结

当我们一开始设计好的一些类不具有现在客户端所需要实现的内容的时候,我们可以使用适配器使他适应。实际开发中尽可能少类。当一类群体有功能抽象类或者接口的时候就可以选择用对象适配器。


更多参考

http://blog.youkuaiyun.com/hguisu/article/details/7527842

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值