设计模式之 适配器模式

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

主要分为三种:

1.类的适配器模式

2.对象的适配器模式

3.接口的适配器模式


1.类的适配器模式

核心思想就是:

有一个Source类,拥有一个方法,有一个目标接口Targetable

通过Adapter类,将Source的功能扩展到Targetable里。

其实是扩展到Targetable的实现类Adapter里,Targetable只是一个接口!

打个不恰当的比方:

两个国家,AB国类似于英格兰,苏格兰等

A国女王管理A国,有一个管理方法methodA,

B国男王也想管理A国,有一个虚拟的方法methodA,以为没有权利所以是虚拟的嘛!

那B国国王怎样能管理A国呢,就是跟A女王生一个孩子Adapter,就间接管理到了A国。

上代码:

public class KingA {
	public void ManageStateA(){
		System.out.println("Manage State A");
	}
}

public interface KingB {
	public void ManageStateA();
}


public class Adapter extends KingA implements KingB {

}

测试代码:

public static void main(String[] args) {		
		KingB mKingB = new Adapter();
		mKingB.ManageStateA();
	}


打印结果

Manage State A

是不是 KingB 管理到了A国?


2.对象的适配器模式

如果B国国王娶不到A国女王怎么办?

如果B国国王的儿子一直努力努力,南征北战当上大帝国皇帝(类似于英国女王, AB国类似于英格兰,苏格兰等)

那A国这也就是B国国王的儿子管辖下的一个元素而已,这样子B国国王也能管理到A国!但是得通过A国国王的传达!不能直接下命令

假设这个儿子叫Wrapper吧!

public class Wrapper implements KingB {
	
	private KingA mKingA;
	
	public Wrapper(KingA mKingA){
		this.mKingA = mKingA;
	}	
	
	@Override
	public void ManageStateA() {
		mKingA.ManageStateA();
	}
}

测试代码:

public static void main(String[] args) {	
		KingA mKingA = new KingA();
		KingB mKingB = new Wrapper(mKingA);
		mKingB.ManageStateA();		
	}

3.接口的适配器模式

接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。

public interface Sourceable {       
    public void methodA();  
    public void methodB();  
}  

实现虚拟类:

public abstract class Wrapper implements Sourceable{  
      
    public void methodA(){}  
    public void methodB(){}  
}  

public class SourceSubA extends Wrapper {  
    public void methodA(){  
        System.out.println("the sourceable interface's first SubA!");  
    }  
} 

public class SourceSubB extends Wrapper {  
    public void methodB(){  
        System.out.println("the sourceable interface's second SubB!");  
    }  
} 

测试代码:

public static void main(String[] args) {  
        Sourceable sourceA = new SourceSubA();  
        Sourceable sourceB = new SourceSubB();  
          
        sourceA.methodA();  
        sourceB.methodB();  
        sourceA.methodA();  
        sourceB.methodB();  
} 

测试输出:

the sourceable interface's first Sub1!
the sourceable interface's second Sub2!

达到了我们的效果!

讲了这么多,总结一下三种适配器模式的应用场景:

类的适配器模式:  当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象的适配器模式: 当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口的适配器模式: 当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值