博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NET设计模式6--适配器模式(Adapter Pattern)
阅读量:5098 次
发布时间:2019-06-13

本文共 3221 字,大约阅读时间需要 10 分钟。

一. 适配器模式

  适配器模式,是将一个类转换成客户期望的另外一个接口。Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作。

  适配器模式的目的就是将类的接口转换成客户对象需要的接口,也就是说我们有一个可以满足我们需要的对象,但是它的接口却不是我们所期望的那样,而我们现在所需要的就是创建一个新的接口,让原本的接口能够满足我们的需要。就像是美国的电源是110V,中国是220V,美国电器来到中国用,必须要通过一个变压器(适配器)来把电流改成110V才能正常使用。

二 适配器的分析

  1.客户期待的接口或者抽象类Target

    ///
 
<summary>
    
///
 客户期待的接口或者抽象类Target
    
///
 
</summary>
    
public
 
abstract
 
class
 Target
    {
        
public
 
abstract
 
void
 Request();
    }

 

  2.要适配的类Adaptee,也就是与期望调用接口不相符的类  

ExpandedBlockStart.gif
代码
    
///
 
<summary>
    
///
 要适配的类Adaptee,也就是与期望调用接口不相符的类
    
///
 
</summary>
    
public
 
class
 Adaptee
    {
        
public
 
void
 SpecificRequest()
        {
            Console.WriteLine(
"
执行要适配类的特殊请求方法!
"
);
        }
    }

 

  3 适配器类Adapter把源接口转换成目标接口,包括变量adaptee

  

ExpandedBlockStart.gif
代码
    
///
 
<summary>
    
///
 适配器类Adapter,把源接口转换成目标接口,包括变量adaptee
    
///
 
</summary>
    
public
 
class
 Adapter : Target
    {
        
public
 Adapter()
        {
            Console.WriteLine(
"
构造函数。。。
"
);
        }
        
private
 Adaptee adaptee;
        
public
 
override
 
void
 Request()
        {
            
if
 (adaptee 
==
 
null
)
            {
                adaptee 
=
 
new
 Adaptee();
            }
            adaptee.SpecificRequest();
        }
    }

 

  4 客户端代码

  

static
 
void
 Main(
string
[] args)
{
    Target target 
=
 
new
 Adapter();
    target.Request();
    Console.Read();
}

 

 

  5运行结果

 

  三 适配器事例

  1.一个基类AdapterPlayer,包含进攻和防守。不同位置都有不同的实现。但是最终大家都适配到了AdapterPlayer

  2.程序

  

ExpandedBlockStart.gif
代码
///
 
<summary>
    
///
 篮球运动员
    
///
 
</summary>
    
public
 
abstract
 
class
 AdapterPlayer
    {
        
protected
 
string
 name;
        
public
 AdapterPlayer(
string
 name)
        {
            
this
.name 
=
 name;
        }
        
public
 
abstract
 
void
 Attack();
        
public
 
abstract
 
void
 Defense();
    }
    
///
 
<summary>
    
///
 前锋
    
///
 
</summary>
    
public
 
class
 Forwards : AdapterPlayer
    {
        
public
 Forwards(
string
 name)
            : 
base
(name)
        { }
        
public
 
override
 
void
 Attack()
        {
            Console.WriteLine(
"
前锋 {0} 进攻
"
,name);
        }
        
public
 
override
 
void
 Defense()
        {
            Console.WriteLine(
"
前锋 {0} 防守
"
,name);
        }
    }
    
///
 
<summary>
    
///
 中锋
    
///
 
</summary>
    
public
 
class
 Center : AdapterPlayer
    {
        
public
 Center(
string
 name):
base
(name)            
        { }
        
public
 
override
 
void
 Attack()
        {
            Console.WriteLine(
"
中锋 {0} 进攻
"
, name);
        }
        
public
 
override
 
void
 Defense()
        {
            Console.WriteLine(
"
中锋 {0} 防守
"
, name);
        }
    }
    
///
 
<summary>
    
///
 后卫
    
///
 
</summary>
    
public
 
class
 Guards : AdapterPlayer
    {
        
public
 Guards(
string
 name)
            : 
base
(name)
        { }
        
public
 
override
 
void
 Attack()
        {
            Console.WriteLine(
"
后卫 {0} 进攻
"
, name);
        }
        
public
 
override
 
void
 Defense()
        {
            Console.WriteLine(
"
后卫 {0} 防守
"
, name);
        }
    }
    
///
 
<summary>
    
///
 外籍中锋
    
///
 
</summary>
    
public
 
class
 ForeignCenter
    {
        
private
 
string
 _name;
        
public
 
string
 Name
        {
            
get
            {
                
return
 _name;
            }
            
set
            {
                _name 
=
 value;
            }
        }
        
public
 
void
 FAttack()
        {
            Console.WriteLine(
"
外籍中锋 {0} 进攻
"
, Name);
        }
        
public
 
void
 FDefense()
        {
            Console.WriteLine(
"
外籍中锋 {0} 防守
"
, Name);
        }
    }
    
///
 
<summary>
    
///
 翻译者
    
///
 
</summary>
    
public
 
class
 Translator : AdapterPlayer
    {
        
private
 ForeignCenter fc 
=
 
new
 ForeignCenter();
        
public
 Translator(
string
 name)
            : 
base
(name)
        {
            fc.Name 
=
 name;
        }
        
public
 
override
 
void
 Attack()
        {
            fc.FAttack();
        }
        
public
 
override
 
void
 Defense()
        {
            fc.FDefense();
        }
    }

 

2. 客户端代码

 

ExpandedBlockStart.gif
代码
        
static
 
void
 Main(
string
[] args)
        {   
           AdapterPlayer ap 
=
 
new
 Forwards(
"
巴蒂尔
"
);
            ap.Attack();
            AdapterPlayer ap1 
=
 
new
 Guards(
"
麦克格雷迪
"
);
            ap1.Attack();
            AdapterPlayer ap2 
=
 
new
 Translator(
"
YaoMing
"
);
            ap2.Attack();
            ap2.Defense();
            Console.ReadKey();
        }

 

  3.运行结果

  

四 总结 

  适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式统一了不兼容对象的接口,使的原本由于接口不兼容而不能工作的那些类可以一起工作。

转载于:https://www.cnblogs.com/taofengli288/archive/2010/09/21/1832451.html

你可能感兴趣的文章
使用fiddler进程弱网测试
查看>>
jdk path
查看>>
敏捷开发笔记 - 设计
查看>>
我需要在电脑上安装C编译器
查看>>
oracle一次删除多张表
查看>>
H3C 配置CHAP验证
查看>>
H3C ICMP
查看>>
Python Numpy 介绍
查看>>
element对象
查看>>
Android SQLite (一) 数据库简介
查看>>
HashMap和HashSet的区别
查看>>
python-2:基础点滴 字符串函数之一 str
查看>>
5th 13.10.21数组求和 求最大数
查看>>
jenkins multijob 插件使用
查看>>
[HEOI2013]SAO(树上dp,计数)
查看>>
设计模式-策略模式
查看>>
批处理(.bat脚本)基本命令语法
查看>>
编写多进程编程
查看>>
[UOJ#454][UER#8]打雪仗
查看>>
常用机器学习算法
查看>>