zoukankan      html  css  js  c++  java
  • 适配器设计模式

     

    适配器设计模式是把一个类的接口转化成客户端期望的接口,从而使原本接口不匹配的两个类能一起工作。

    实际中这种场景很容易碰到,比如A类型手机充电器需要10V电压充电,B类型手机需要15V电压充电。A类型手机的充电器价格非常昂贵,而B类型的充电器价格低廉。市场就有可能出现把B型充电器转换成A型手机匹配的适配器。

    适配器设计模式有两种:

    类适配器:使用继承实现接口转换。

    实例适配器:使用组合实现接口转换。

    类适配器

    类图:
    类适配器设计的角色:

    源:被适配的类。

    目标:客户期望的接口.由于适配器需要继承源。所以目标必须是接口。

    适配器:把源接口转换成目标接口。适配器需要继承源。

    代码:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 源:被适配者

    /// </summary>

    public class Adaptee

    {

    /// <summary>

    /// 响应特殊的请求

    /// </summary>

    public void SpecialRequest()

    {

    Console.WriteLine("Call SpecialRequest");

    }

    }

    /// <summary>

    /// 目标:客户端期望的接口。必须是接口

    /// </summary>

    public interface ITarget

    {

    /// <summary>

    /// 客户端期望的响应请求方法

    /// </summary>

    void Request();

    }

    /// <summary>

    /// 适配器

    /// </summary>

    public class ClassAdapter : Adaptee,ITarget

    {

    #region ITarget 成员

    /// <summary>

    /// 实现期望的接口

    /// </summary>

    public void Request()

    {

    base.SpecialRequest();

    }

    #endregion

    }

    }

    调用示例:

    //类适配器

    Console.WriteLine("类适配器");

    ITarget iTarget = new ClassAdapter();

    iTarget.Request();

    实例适配器

    类图
    实例适配器设计的角色:

    源:被适配的类。

    目标:客户期望的接口.由于适配器中包装源。所以目标可以是类,抽象类,接口。

    适配器:把源接口转换成目标接口。适配器包装源。

    代码:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 源:被适配者

    /// </summary>

    public class Adaptee

    {

    /// <summary>

    /// 响应特殊的请求

    /// </summary>

    public void SpecialRequest()

    {

    Console.WriteLine("Call SpecialRequest");

    }

    }

    /// <summary>

    /// 目标:客户端可以期望接口,可以是具体类也可以是抽象类,

    /// 也可以是接口

    /// </summary>

    public class Target

    {

    /// <summary>

    /// 期望的方法

    /// </summary>

    virtual public void Request()

    {

    }

    }

    }

    /// <summary>

    /// 适配器:内部包装源,把源接口转换成目标接口

    /// </summary>

    public class InstanceAdapter : Target

    {

    private Adaptee adaptee = null;

    public InstanceAdapter(Adaptee adt )

    {

    adaptee = adt;

    }

    public override void Request()

    {

    adaptee.SpecialRequest();

    }

    }

    }

    调用示例:

    //对象适配器

    Console.WriteLine("对象适配器");

    Adaptee adt=new Adaptee ();

    Target target = new InstanceAdapter(adt );

    target.Request();

  • 相关阅读:
    HDU 4539郑厂长系列故事――排兵布阵(状压DP)
    HDU 2196Computer(树形DP)
    HDU 4284Travel(状压DP)
    HDU 1520Anniversary party(树型DP)
    HDU 3920Clear All of Them I(状压DP)
    HDU 3853LOOPS(简单概率DP)
    UVA 11983 Weird Advertisement(线段树求矩形并的面积)
    POJ 2886Who Gets the Most Candies?(线段树)
    POJ 2828Buy Tickets
    HDU 1394Minimum Inversion Number(线段树)
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1950842.html
Copyright © 2011-2022 走看看