概述:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器实验:
实现一个类,该类有一个实数数组的排序的方法。现在想对一个整数排序,请利用适配器完成该实验。
类适配器模式:
对象适配器模式:
1、Target接口:
声明所有需要的方法。
public interface Target { //Target接口,声明所有需要的方法 List<Double> RealNumSort(List<Double> realNumbers);//实数排列 List<Int32> IntNumSort(List<Int32> realNumbers);//整数排列 } |
2、现存的实数排序类RealNumberSort类:
类中有实现实数排列的方法RealNumSort。
public class RealNumberSort { public List<Double> RealNumSort(List<Double> realNumbers) { //实现实数排列 realNumbers.Sort(); return realNumbers; } } |
3、类适配器模式类ClassAdapter:
该类实现了Target接口的IntNumSort方法,还继承了RealNumberSort类的RealNumSort方法。
public class ClassAdapter : RealNumberSort,Target { //实现了Target接口,并继承了实数排列类RealNumberSort的方法
private RealNumberSort realNumber = new RealNumberSort(); //实现Target接口的IntNumSort方法 public List<Int32> IntNumSort(List<Int32> realNumbers) { List<Double> doubList = new List<Double>(); foreach (Int32 num in realNumbers) { doubList.Add(Convert.ToDouble(num)); } doubList = realNumber.RealNumSort(doubList);//继承了RealNumberSort类的RealNumSort方法 List<Int32> intNums = new List<Int32>(); foreach(Double doub in doubList) { intNums.Add(Convert.ToInt32(doub)); } return intNums; } } |
4、对象适配器模式:
该类实现了Target接口的IntNumSort方法,并调用了RealNumberSort类的RealNumSort方法。
public class ObjectAdapter : Target { //对象适配器模式模式 private RealNumberSort realNumber1 = new RealNumberSort();
public List<Double>RealNumSort(List<Double> doubleNum) { //调用RealNumberSort的RealNumSort方法 return realNumber1.RealNumSort(doubleNum); } public List<Int32> IntNumSort(List<Int32> intNumbers) { //实现了Target的IntNumSort方法 List<Double> doublelist = new List<Double>(); foreach (Int32 ins in intNumbers) { doublelist.Add(Convert.ToDouble(ins)); }
doublelist = RealNumSort(doublelist);//排序 List<Int32> intNumbs = new List<int>(); foreach (Double dbe in doublelist) { intNumbs.Add(Convert.ToInt32(dbe)); } return intNumbs; } } |
类适配器模式和对象适配器模式的不同点在于类适配器模式继承已知类的方法,而对象适配器模式调用已知类的方法。对于一个被适配类中如果有大量的方法,使用类适配器模式会比较合适。如果被适配类有多个,由于很多面向对象编程语言中不支持多继承,所以使用对象适配器比较合适。