HeadFrist设计模式学习之适配器模式

原创 2016年05月30日 17:36:03
适配器模式定义:
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
需求描述:
JVM的公园里有很多动物,在必要时会将动物们放置在BOX里面,所以有很多Box和动物。
现有的是一个可以放置十个鸭子的DuckBox类,其showMsg()方法可以打印每个位置的信息,具体如下:
DuckBox类:
class DuckBox {
   private ArrayList<Duck> duck;
   private int count;
   public DuckBox() {

 duck=new ArrayList<Duck>();
 count=0;
}
   
   public boolean add(Duck duck)
   {
  if(!isFull()){
  this.duck.add(duck);
  count++;
  return true;
  }
  else
  return false;
   }
   public boolean isFull()
   {
  if(count==10)
  return true;
  else
  return false;
   }
   public void showMsg()
   {
  for(Duck d:this.duck)
  {
  System.out.print("position:"+duck.indexOf(d)+"------MSG:"+ d.getDescription()+"\n");
  }
   }
}
Duck类:
class Duck {
private String description="this is a duck";
public String getDescription()
{
return description;
}


}
测试代码:
class Run {


public static void main(String[] args) {
// TODO Auto-generated method stub


DuckBox db=new DuckBox();
while(db.add(new Duck()));
db.showMsg();
}


}
结果————————————
position:0------MSG:this is a duck
position:1------MSG:this is a duck
position:2------MSG:this is a duck
position:3------MSG:this is a duck
position:4------MSG:this is a duck
position:5------MSG:this is a duck
position:6------MSG:this is a duck
position:7------MSG:this is a duck
position:8------MSG:this is a duck
position:9------MSG:this is a duck
-----------------------------------
问题:放鸡的Box不够用了,但是放鸭子的Box有剩余,如何做才能使DuckBox类能够同时放置Chicken和Duck呢?
解决方法:
创建一个基类:animal,让Duck和Chicken同时继承animal,将DuckBox中ArrayList<Duck>改为ArrayList<animal>.
这的确是可行的,但是其中存在的问题有两点:
①:DuckBox 可以放置的动物类型好像不止两种,任何实现了animal的类都可以放进来,这样还不如叫Box(失去了设计类本身的意义)。
②:当这种需求变得普遍时(即很多种动物都需要借居在其他相近的动物箱里),整个程序结构变得相当混淆。
这种错误使用多态的方式 使程序变得难以理解(既然名为DuckBox,为什么声明为animal?),我们应该换种思路,使用组合(适配器模式上场了! )。  
将一个chicken类与继承Duck类的“包装”,组合起来,这样在DuckBox看起来是个Duck,但是在方法内部调用的都是Chicken的,就像下面这样:
class DuckAdapter extends Duck {
Chicken c;
public DuckAdapter(Chicken c) {
// TODO Auto-generated constructor stub
this.c=c;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return c.getDescription(); //这里调用的是chicken的方法
}
  
}
测试代码:
class Run {


public static void main(String[] args) {
// TODO Auto-generated method stub


DuckBox db=new DuckBox();
while(db.add(new Duck()))
{
db.add(new DuckAdapter(new Chicken()));
};
db.showMsg();
}


}
   结果--------------------------------
position:0------MSG:this is a duck
position:1------MSG:this is a chicken
position:2------MSG:this is a duck
position:3------MSG:this is a chicken
position:4------MSG:this is a duck
position:5------MSG:this is a chicken
position:6------MSG:this is a duck
position:7------MSG:this is a chicken
position:8------MSG:this is a duck
position:9------MSG:this is a chicken
----------------------------------------
好了,这样就得到了比上面更好的解决方案,这种方案的缺点是你几乎要重写所有的方法来达到适配的目的,但是相比程序混淆和难以理解,这是值得的。
版权声明:本文为博主原创文章,转载请注明出处

23种设计模式(13):适配器模式

本文主要介绍设计模式中的适配器模式。
  • psp0001060
  • psp0001060
  • 2016年02月25日 16:21
  • 587

Java设计模式菜鸟系列(八)适配器模式建模与实现

适配器模式(Adapter):将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。 主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 1...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月05日 19:52
  • 2350

设计模式-缺省适配器模式

介绍大家所熟悉的是如果实现某一个接口,必须实现接口中的每一个方法。在适配器模式中,如果目标(Target)角色中的方法众多,需要的仅仅几个。但是根据接口的实现规则,其余的方法也必须实现,这必然造成了很...
  • IO_Field
  • IO_Field
  • 2016年10月11日 21:31
  • 1094

java 设计模式-----适配器模式

现实中的问题 有一个插座,这个插座是三个口的,但是我们手上只有两个触角的插头,一种笨方法就是直接强行把两个触角掰弯,插进去(这种事情我就做过),还有一种方法就是找一个转换头来。 ...
  • yujin753
  • yujin753
  • 2015年05月31日 12:12
  • 1057

设计模式:适配器模式和代理模式的区别

(转载)http://blog.sina.com.cn/s/blog_a37588100102uzo0.html 1.简介        适配器模式:适配器模式(英语:adapter patter...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016年03月03日 10:21
  • 966

一个示例让你明白适配器模式

本文讨论适配器模式。适配器模式是23中设计模式之一,它的主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。为了举这个例子,我还特意去京东上搜了一下电源转换器,确实看到了很多...
  • brave2211
  • brave2211
  • 2014年01月26日 00:08
  • 42252

JAVA设计模式初探之适配器模式

1. 概述   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 2. 解决的问题   即Adapter模式使得原本由于接口不...
  • jason0539
  • jason0539
  • 2014年03月29日 07:53
  • 45124

设计模式(二) 三种适配器模式 总结和使用场景

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】一 概述定义:适配器模式将某个类的接口转换成客...
  • zxt0601
  • zxt0601
  • 2016年10月18日 16:34
  • 3026

最常用的设计模式---适配器模式(C++实现)

sdfsfd
  • lh844386434
  • lh844386434
  • 2014年01月06日 22:24
  • 2025

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式、代理模式。一、享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到。其概念:运用共享内存技术最大限度的支持大...
  • yanzi1225627
  • yanzi1225627
  • 2014年07月10日 23:33
  • 2783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HeadFrist设计模式学习之适配器模式
举报原因:
原因补充:

(最多只允许输入30个字)