C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

模式设计c#--结构型--Adapter

名称 Adapter
结构 o_adapter.bmp

 
意图 将一个类的接口转换成客户希望的另外一个接口。A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性
  • 你想使用一个已经存在的类,而它的接口不符合你的需求。
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • (仅适用于对象A d a p t e r )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

Code Example
OurAdapter聚集了FrameworkXTraget 和FrameworkYTarget的功能.
namespace Adapter_DesignPattern
{
    
using System;

    
class FrameworkXTarget 
    
{
        
virtual public void SomeRequest(int x)
        
{
            
// normal implementation of SomeRequest goes here                    
        }

    }


    
class FrameworkYAdaptee
    
{
        
public void QuiteADifferentRequest(string str) 
        
{
            Console.WriteLine(
"QuiteADifferentRequest = {0}", str);
        }
        
    }


    
class OurAdapter : FrameworkXTarget
    
{
        
private FrameworkYAdaptee adaptee = new FrameworkYAdaptee();
        
override public void SomeRequest(int a)
        
{
            
string b;
            b 
= a.ToString();
            adaptee.QuiteADifferentRequest(b);
        }
        
    }


    
/// <summary>
    
///    Summary description for Client.
    
/// </summary>

    public class Client
    
{
        
void GenericClientCode(FrameworkXTarget x)
        
{
            
// We assume this function contains client-side code that only 
            
// knows about FrameworkXTarget.
            x.SomeRequest(4);
            
// other calls to FrameworkX go here
            
// 
        }

        
        
public static int Main(string[] args)
        
{
            Client c 
= new Client();
            FrameworkXTarget x 
= new OurAdapter();
            c.GenericClientCode(x);    
            
return 0;
        }

    }

}


通过继承Target和成员Adaptee 的适配方式,使Adapter 最终满足我们的需要!
// Adapter pattern -- Structural example  


using System;

namespace DoFactory.GangOfFour.Adapter.Structural
{

  
// Mainapp test application 

  
class MainApp
  
{
    
static void Main()
    
{
      
// Create adapter and place a request 
      Target target = new Adapter();
      target.Request();

      
// Wait for user 
      Console.Read();
    }

  }


  
// "Target" 

  
class Target
  
{
    
public virtual void Request()
    
{
      Console.WriteLine(
"Called Target Request()");
    }

  }


  
// "Adapter" 

  
class Adapter : Target
  
{
    
private Adaptee adaptee = new Adaptee();

    
public override void Request()
    
{
      
// Possibly do some other work 
      
// and then call SpecificRequest 
      adaptee.SpecificRequest();
    }

  }


  
// "Adaptee" 

  
class Adaptee
  
{
    
public void SpecificRequest()
    
{
      Console.WriteLine(
"Called SpecificRequest()");
    }

  }

}

 

上面例子可以认为是对象的Adapter模式, 因为target为一个实际的类,不是一个接口
以下为类的Adapter设计模式: 因为target 为一个接口,又接口规范,且没有实例成员
//  Class Adapter pattern -- Structural example  
using System;

// "ITarget"
interface ITarget
{
  
// Methods
  void Request();
}


// "Adaptee"
class Adaptee
{
  
// Methods
  public void SpecificRequest()
  
{
    Console.WriteLine(
"Called SpecificRequest()" );
  }

}


// "Adapter"
class Adapter : Adaptee, ITarget
{
  
// Implements ITarget interface
  public void Request()
  
{
    
// Possibly do some data manipulation
    
// and then call SpecificRequest
    this.SpecificRequest();
  }

}


/**//// <summary>
/// Client test
/// </summary>

public class Client
{
  
public static void Main(string[] args)
  
{
    
// Create adapter and place a request
    ITarget t = new Adapter();
    t.Request();
  }

}


总结: 类适配器比对象适配器更好

         类适配器提供了接口规范,
         但是对象适配器没有,如果target改变接口的话,adaper可能没有跟着改变,最后导致error.也又可能会错用target里的实例成员.

posted on 2006-01-03 15:41 梦在天涯 阅读(1014) 评论(3)  编辑 收藏 引用 所属分类: Design pattern

评论

# re: 模式设计c#--结构型--Adapter 2006-04-24 14:14 梦在天涯

在以下各种情况下使用适配器模式:

1、 系统需要使用现有的类,而此类的接口不符合系统的需要。
2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
  回复  更多评论   

# re: 模式设计c#--结构型--Adapter 2006-04-24 14:15 梦在天涯

Adapter模式在实现时有以下这些值得注意的地方:

1、 目标接口可以省略,模式发生退化。但这种做法看似平庸而并不平庸,它可以使Adaptee不必实现不需要的方法(可以参考Default Adapter模式)。其表现形式就是父类实现缺省方法,而子类只需实现自己独特的方法。这有些像模板(Template)模式。
2、 适配器类可以是抽象类。
3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。
  回复  更多评论   

# re: 模式设计c#--结构型--Adapter 2006-04-24 16:01 梦在天涯

和代理模式的区别:  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1795791
  • 排名 - 5

最新评论

阅读排行榜