C# 设计模式-适配器模式

适配器模式就是将2个物理上没有关系(不存在继承,或者存在同一个父类)的对象连接起来。

但是这2个对象逻辑上又是存在一定关联的,包含的方法的都一样。

class A{
    public void Fun1();
    public void Fun2();
}
class B{
    public void Fun1();
    public void Fun2();
}

上述A,B两个独立的类,不存在任何关系,但是他们的方法都是一样的,或者说方法名不同,但是作用是一样的。

适配器标准定义:

将一个类的接口转换成期望的另一个接口。

适配器模式分为2种


对象适配器:

场景:kfc原本是卖可口可乐的,但是刚好可口可乐卖完了,就需要用百事可乐来代替,但是又不能让顾客有明显的察觉。

先定义可口可乐的特征接口

    public interface ICoca
    {
        //甜味
        void Sweet();
        //黑色的
        void Black();
        //会发出呲呲的声音
        void Cici();
    }

再定义一个百事可乐的特征接口

public interface IPepsi
    {
        //甜味
        void Sweet();
        //黑色的
        void Black();
        //会发出呲呲的声音
        void Cici();
    }

我们认为只要任何一种饮料符合上面3个特质,就可以认为他是可口可乐了,所以可以让百事来冒充可口可乐了。

所以接下来定义一个适配器

    public class PepsiAdapter : ICoca
    {
        private readonly IPepsi _pepsi;

        public PepsiAdapter(IPepsi pepsi)
        {
            _pepsi = pepsi;
        }

        public void Sweet()
        {
            _pepsi.Sweet();
        }

        public void Black()
        {
            _pepsi.Black();
        }

        public void Cici()
        {
            _pepsi.Cici();
        }
    }

这个PepsiAdapter继承于ICoca,表明可以建立这个PepsiAdapter类可以生成ICoca的类,在里面创建Pepsi类型,在各个方法里面调用对应的Pepsi方法,就可以是Coca和Pepsi类无缝衔接,效果就是我们任然调用着Coca的方法,但其实我们调用的是Pepsi的类。相当于虽然包装上写的是可口可乐,味道也是可口可乐的味道,但是实际上我们和的是百事可乐。

调用:

    class Program
    {
        static void Main(string[] args)
        {
            //正常的coca调用
            ICoca coca = new Coca();
            coca.Black();
            coca.Cici();
            coca.Sweet();

            //建立一个Pepsi对象
            IPepsi pepsi = new Pepsi();
            //用适配器将Pepsi转换从ICoca
            ICoca pepsiAdapter = new PepsiAdapter(pepsi);
            //像调用ICoca的方式去调用这个适配器,和调用Coca一样
            pepsiAdapter.Black();
            pepsiAdapter.Cici();
            pepsiAdapter.Sweet();
            Console.ReadLine();
        }
    }

然后封装一样调用的方法

    class Program
    {
        static void Main(string[] args)
        {
            //正常的coca调用
            ICoca coca = new Coca();
            TestCoca(coca);

            //建立一个Pepsi对象
            IPepsi pepsi = new Pepsi();
            //用适配器将Pepsi转换从ICoca
            ICoca pepsiAdapter = new PepsiAdapter(pepsi);
            //像调用ICoca的方式去调用这个适配器,和调用Coca一样
            TestCoca(pepsiAdapter);
            Console.ReadLine();
        }

        static void TestCoca(ICoca coca)
        {
            coca.Black();
            coca.Cici();
            coca.Sweet();
        }
    }

即完全可以像调用coca一样调用pepsi。


类适配器:

C#和Java都无法实现,只有能够支持多重继承的语言才能实现,例如C++.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值