当前位置:编程学习 > C#/ASP.NET >>

适配器模式(Adepter)

 

  适配器模式(Adepter),将一个类的接口转换成客户希望的另外一个接口。Adepter模式使得原本由于模式不兼容而不能一起工作的那些类,可以一起工作。
      在软件开发中,当系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境不一致的情况,比如要在需要对早起代码复用,一些功能等应用上很有实用价值。
      适配器模式UML类图:
       分析:
       Target是客户所期待的接口,目标可以是具体的或抽象的类也可以是接口;Adeptee是需要适配的类;Adepter是适配器类,通过在内部包装一个Adeptee对象把源接口转换成目标接口。
       适配器模式实现:
 
[csharp] 
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Adepter  
{  
    /* 
     * 这是客户所期待的接口,目标可以是具体的或抽象的类也可以是接口 
     */  
    class Target  
    {  
        public virtual void Request()  
        {  
            Console.WriteLine("普通请求...");  
        }  
    }  
    /** 
     * 需要适配的类 
     */  
    class Adeptee  
    {  
        public void SpecificRequest()  
        {  
            Console.WriteLine("特殊请求...");  
        }  
    }  
  
    /* 
     * Adepter通过在内部包装一个Adeptee对象把源接口转换成目标接口 
     */  
    class Adepter : Target  
    {  
        private Adeptee adeptee = new Adeptee();//这是一个私有的Adeptee对象  
  
        public override void Request()  
        {  
            this.adeptee.SpecificRequest();//这样就可以把表面调用Request()方法,转换为调用SpecificRequest()方法  
            //base.Request();  
        }  
    }  
}  
客户端:
 
 
[csharp]  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Adepter  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Target target = new Adepter();  
            target.Request();//对客户来说,调用的就是Target的Request()  
  
            Console.Read();  
        }  
    }  
}  
       适配器模式总结: 
 
       当使用一个已经存在的类,但是它的接口也就是它的方法或你的要求不相同时;两个类所做的事情相同或者相似但是接口不同时,应该考虑使用适配器模式。这样客户可以统一调用一个接口,从而更简单、更直接、更紧凑。
       适配器模式案例—篮球翻译适配器
 
[csharp]  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace AdepterExample  
{  
    abstract class Player  
    {  
        private string name;  
        public Player(string name)  
        {  
            this.name = name;  
        }  
        public string getName()  
        {  
            return this.name;  
        }  
        public void setName(string name)  
        {  
            this.name = name;  
        }  
  
        public abstract void Attack();  
        public abstract void Defense();  
    }  
  
    class Forwards : Player  
    {  
        public Forwards(string name):base(name){}  
        public override void Attack()  
        {  
            Console.WriteLine("前锋{0},进攻!",this.getName());  
            //throw new NotImplementedException();  
        }  
        public override void Defense()  
        {  
            Console.WriteLine("前锋{0},防守!", this.getName());  
            //throw new NotImplementedException();  
        }  
    }  
  
    class Center : Player  
    {  
        public Center(string name) : base(name) { }  
        public override void Attack()  
        {  
            Console.WriteLine("中锋{0},进攻!", this.getName());  
            //throw new NotImplementedException();  
        }  
        public override void Defense()  
        {  
            Console.WriteLine("中锋{0},防守!", this.getName());  
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,