23种设计模式——适配器模式

适配器模式描述如何将类或者对象结合在一起形成更大的结构。将一个接口转换成客户希望的另一个接口,从而使接口不兼容的类可以一起工作,别名为包装器。既可以作为类结构型模型,也可以作为对象结构模型。

类适配器:

对象适配器:

其中Target表示抽象目标类,表示客户使用的特定接口,不能随意改动。Adapter表示适配器类,用于调用另一个接口也叫转换器,对Adaptee和Target适配。Adaptee表示适配者类,用于定义一个已经存在的接口改接口需要被适配。Client为客户类

如果是类适配器Adapter实现了Target接口,并且继承了Adaptee类,在实现Target接口的request();方法中直接调用从Adaptee继承过来的specifiRequest();方法。

如果是对象适配器Adapter继承了Target类,并且与Adaptee是关联关系。即在Adapter中定义了Adaptee对象。因此可以调用Adaptee中的方法。

类适配器中使用一个具体类吧适配者是配到目标接口中,这样适配者以及适配者子类都是用改适配器适配就不可行,不能同时适配多个适配者。当有多个适配者时只能创建多个适配器类。而对象适配器中同一个适配器类可以把多个不同适配者适配到一个目标。

实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。

猫狗分别有接口ICat、IDog。两个接口具体实现CatImpl、DogImpl。适配器Adapter类实现接口,并且与接口关联。

IDog.java

public interface IDog {

	public void dogLook();
	public void wang();
}

ICat.java

public interface ICat {
	
	public void catLook();
	public void eat();
}

DogImpl.java

public class DogImpl implements IDog{

	public void dogLook() {
		// TODO Auto-generated method stub
		System.out.println("狗的样子");
	}

	public void wang() {
		// TODO Auto-generated method stub
		System.out.println("狗汪汪叫");
	}

}

CatImpl.java

public class CatImpl  implements ICat{

	public void catLook() {
		// TODO Auto-generated method stub
		System.out.println("猫的样子");
	}

	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猫抓老鼠");
	}

}

Adapter.java

package softDes;

public class Adapter implements ICat,IDog{

	private IDog DogImpl = null;
	private ICat CatImpl = null;
	
	/*public Adapter(IDog DogImpl ) {
		// TODO Auto-generated constructor stub
		this.DogImpl = DogImpl;
	}
	public Adapter(ICat CatImpl) {
		// TODO Auto-generated constructor stub
		this.CatImpl = CatImpl;
	}*/
	
	
	public Adapter(IDog DogImpl,ICat CatImpl) {
		// TODO Auto-generated constructor stub
		this.DogImpl = DogImpl;
		this.CatImpl = CatImpl;
	}
	@Override
	public void dogLook() {
		// TODO Auto-generated method stub
		System.out.println("狗模仿");
		CatImpl.catLook();
	}

	@Override
	public void wang() {
		// TODO Auto-generated method stub
		System.out.println("狗模仿");
		CatImpl.eat();
	}

	@Override
	public void catLook() {
		// TODO Auto-generated method stub
		System.out.println("猫模仿");
		DogImpl.dogLook();
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猫模仿");
		DogImpl.wang();
	}
	
	
}

Client.java

public class Client {
	public static void main(String[] args) {
		Adapter adapter = new Adapter(new DogImpl(),new CatImpl());

		adapter.catLook();
		adapter.eat();

		System.out.println("**************");

		adapter.dogLook();
		adapter.wang();

	}

}

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值