您的位置:首页 > 其它

设计模式(六)适配器模式(Adapter)-结构型

2015-04-27 22:49 501 查看
适配器模式Adapter

有多个人使用一个接口A的方法,不同的人需要不同的方法实现,这时候就需要用到适配器模式

可以先使用一个类B实现该接口,但是其中的方法全不进行任何实现 ,接着谁需要里面的方法,就自己定义一个类C_X然后继承类B,覆盖其中的需要的方法。

适配器分为对象适配器和类适配器:对象适配器实现目标类的接口,依赖适配者类;类适配器继承适配者,并实现目标类的接口。

适配器模式的类图


适配器原理图
适配器模式的代码实现

// 定义客户端期待的接口
public class Target{
        /// <summary>
        /// 使用virtual修饰以便子类可以重写
        /// </summary>
        public virtual void Request(){
            Console.WriteLine("This is a common request");
        }
    }
    // 定义需要适配的类
    public class Adaptee{
        public void SpecificRequest(){
            Console.WriteLine("This is a special request.");
        }
    }
    /// 定义适配器
    public class Adapter:Target{
        // 建立一个私有的Adeptee对象
        private Adaptee adaptee = new Adaptee();

        /// <summary>
        /// 通过重写,表面上调用Request()方法,变成了实际调用SpecificRequest()
        /// </summary>
        public override void Request(){
            adaptee.SpecificRequest();
        }
}
客户端代码

class Program{
        static void Main(string[] args){
            // 对客户端来说,调用的就是Target的Request()
            Target target = new Adapter();
            target.Request();
            Console.Read();
        }
}

将Map转为List的适配器实例

public class PeopleAdapter extends ArrayList<Object>{
	private Map<?,?> map;
	public PeopleAdapter(Map<?,?> map){
		super();
		this.map = map;
	}	
	public int size(){
		return map.size();
	}	
	public Object get(int i) {
		return map.get(i);
	}	
}
模式总结

(1)适配器模式也是一种包装模式,与之前的 Decorator 装饰模式同样具有包装的功能;此外,对象适配器模式还具有显式委托的意思在里面(其实类适配器也有这种意思,只不过比较隐含而已),那么我在认为它与 Proxy 代理模式也有点类似;

(2)从上面一点对比来看, Decorator 、 Proxy、 Adapter 在实现了自身的最主要目的(这个得看各个模式的最初动机、描述)之外,都可以在包装的前后进行额外的、特殊的功能上的增减,因为我认为它们都有委托的实现意思在里面;

(3)我所看的书中说适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: