软件设计模式---适配器模式

目录

1.适配器模式

2.分类

①类适配器模式

②对象适配器模式

③接口适配器模式

3.主要角色

①目标接口

②适配类

③适配器类

4.例题

①类图

②代码

③结果


1.适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。

双向适配器模式:在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法。

2.分类

①类适配器模式

通过多重继承目标接口和被适配者类方式来实现适配(希望将一个类转换成满足另一个新接口的类)。

②对象适配器模式

使用组合来实现适配(希望将一个对象转换成满足另一个新接口的对象)。

③接口适配器模式

当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。

注意:根据合成复用原则,组合大于继承。因此,类的适配器模式应该少用。

3.主要角色

①目标抽象类

当前系统业务所期待的接口,可以是抽象类或接口。

适配者类

被访问和适配的现存组件库中的组件接口,适配者(被适配的角色)一般是一个具体类。

③适配器类

一个转换器,通过继承或引用适配者的对象,把适配器接口转换成目标接口。

4.例题

使用Java语言实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫(Cry()),狗可以学猫抓老鼠(catchMouse())。要求绘制相应的类图并写出适配器(Adapter)类的代码。

①类图

②代码

//1)创建目标抽象类Cat
package com.rw.adapter;
public interface  Cat {
	public void meow();
	public void catchMouse();
}

//2)创建适配者类ConcreteCat ,为正常的小猫
package com.rw.adapter;
public class ConcreteCat implements Cat {
	public void meow() {
		System.out.println("喵喵喵~");
	}
	public void catchMouse() {
		System.out.println("抓老鼠");
	}
}

//3)创建目标抽象类Dog 
package com.rw.adapter;
public interface Dog {
	public void cry();
	public void holdBone();
}

//4)创建适配者类ConcreteDog ,为正常的小狗
package com.rw.adapter;
public class ConcreteDog implements Dog{
	public void cry() {
		System.out.println("汪汪汪~");
	}
	public void holdBone() {
		System.out.println("叼骨头");
	}
}

//5)创建适配器类Adapter ,在猫的动作中调用狗的动作,在狗的动作中调用猫的动作
package com.rw.adapter;
public class Adapter implements Cat,Dog {
	private Cat cat;
	private Dog dog;
	public void setCat(Cat cat) {
		this.cat=cat;	
	}
	public void setDog(Dog dog) {
		this.dog=dog;	
	}
	public void meow() {
		dog.cry();
	}
	public void catchMouse() {
		dog.holdBone();
	}
	public void cry() {
		cat.meow();
	}
	public void holdBone() {
		cat.catchMouse();
	}
}

//6)创建测试类Client 
package com.rw.adapter;
import java.util.Scanner;
public class Client {
	   public static void main(String[] args) {
		   Scanner scanner =new Scanner(System.in);
		   Cat cat0=new ConcreteCat();
		   Dog dog0=new ConcreteDog();
		   
		   Adapter adp=new Adapter();
		   Cat cat=new ConcreteCat();
		   Dog dog=new ConcreteDog();
		   adp.setCat(cat);
		   adp.setDog(dog);
		   
		   System.out.println("正常的猫:");
		   cat0.meow();
		   cat0.catchMouse();
		   System.out.println("正常的狗:");
		   dog0.cry();
		   dog0.holdBone();
		   
		   System.out.println("");
		   while(true)
		   {
			   System.out.println("请输入您想要的选择:");
			   System.out.println("1:猫学狗叫  2:猫学狗叼骨头");
			   System.out.println("3:狗学猫叫  4:狗学猫抓老鼠");
			   int i=scanner.nextInt();
			   if(i==1){
				   adp.meow();}
			   else if(i==2){
				   adp.catchMouse();}
			   else if(i==3){
				   adp.cry();}
			   else if(i==4){
				   adp.holdBone();}
			   else {
				   System.out.println("输入有误, 请按照提示再次输入!");}
		   }
	   }
}

③结果

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值