Adapter(结构型模式——适配器模式)

适配:
不改变原有实现基础上,将原来不兼容的接口转为兼容的接口。

适配器模式
在这里插入图片描述
意图:
在这里插入图片描述
适配器有两种:对象适配器和类适配器
优先使用对象适配器
1、对象适配器
结构:
Adaptee是Adapter的字段
在这里插入图片描述
例子:
场景:通过ArrayList来实现Stack
Adapter:Stack(适配器)
Adaptee:ArrayList(被适配对象)

namespace AdapterMethod
{
    public interface IStack//客户期望的接口
    {
        void Push(object item);
        object Pop();
        object Peek();
    }

    //对象适配器
    //将ArrayList适配,改变接口为Stack
    public class Stack : IStack//Adapter,适配对象
    {
        private ArrayList list;//Adaptee,被适配的对象

        public Stack()
        {
            list = new ArrayList();
        }

        public void Push(object item)
        {
            list.Add(item);
        }

        public object Pop()
        {
            object pop = list[list.Count - 1];
            list.RemoveAt(list.Count-1);
            return pop;
        }

        public object Peek()
        {
            return list[list.Count - 1];
        }
    }

2、类适配器
结构
在这里插入图片描述
例子
场景:通过ArrayList来实现Stack

 public interface IStack//客户期望的接口
    {
        void Push(object item);
        object Pop();
        object Peek();
    }
//类适配器
public class Stack01 : ArrayList, IStack
{
    public void Push(object item)
    {
        this.Add(item);
    }

    public object Pop()
    {
        object pop = this[this.Count - 1];
        this.RemoveAt(this.Count - 1);
        return pop;
    }

    public object Peek()
    {
        return this[this.Count - 1];
    }
}

为什么优先使用对象适配器?
因为类适配器继承自原接口(ArrayList)和用户期望接口(IStack),这样这个类(Stack01)即可以用在原接口可用的位置,又可以用在用户期望接口可用的位置,这样违反了单一职责原则。

具体完整的例子
1、已存在的类

public class ExitingClass//已存在的类
    {
        public void SpecificRequst1()
        {
        }

        public void SpecificRequest2()
        {
        }
    }

2、新环境使用的接口

    interface ITarget//新环境使用的接口
    {
        void Requst();
    }

3、适配器

 class Adapter : ITarget
    {
        private ExitingClass adaptee;

        ExitingClass Adaptee()
        {
            return new ExitingClass();
        }

        public void Requst()
        {
            adaptee.SpecificRequest2();
            adaptee.SpecificRequst1();
        }
    }

4、使用

    class  MySystem
    {
        public void Process(ITarget target)
        {
        }
    }

要点
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值