面向对象编程思想-适配器模式

一、引言

富兰克林揭秘了雷电的真实面目,那我们是否设想过将雷电储存下来呢?生活中如果买了国外的电器(美国、日本)使用电压为110V的,可国内通常电压是220V的,国外电器使用电压与国内电压不符,那怎么才能让它适用国内这个环境而正常使用呢?我们知道这时候需要用到电源适配器220V-110V,电器才能正常使用。电源适配器实现能使用220V电压方法,但实质调用的是使电器能使用110V电压这一行为。类比在程序设计中,也存在这样的思想,没错就是我们今天要学习的结构型设计模式之适配器模式

二、适配器模式

定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。

适配器模式有类适配器模式和对象适配器模式,下面是类的适配器模式代码demo

 

  //客户所期待的接口,目标可以是具体或者抽象的类,也可以是接口(充当现有三孔插头电器)
    public interface IThreeHole
    {
        void Request();
    }

 

  //两口插头 源角色- 需要适配的类(可以理解为现有一个两孔插座)
    public abstract class TwoHole
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是两孔插头");
        }
    }

 

    //电源适配器 (类适配器)
    //适配器提供三孔插头的行为  实质调用两孔插头的方法
    public class PowerAdapter : TwoHole, IThreeHole
    {
        public void Request()
        {
            this.SpecificRequest();
        }
    }

 

     static void Main(string[] args)
        {
            //(类的适配器)通过电源适配器 使用两孔插头
            IThreeHole hole = new PowerAdapter();
            hole.Request();
            Console.Read();

        }

 

下面是对象的适配器代码demo

   //三孔插头  目标角色
    public class ThreeHole
    {
        public virtual void Request()
        {

        }
    }

 

   //两孔插头 源角色
    public class TwoHole1
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是两孔插头");
        }
    }

 

  //(对象的适配器类)适配器类 没有继承TwoHole1类
    //通过在内部包装一个Twohole1对象,使得源接口转换成目标接口
    public class PowerAdapter1 : IThreeHole
    {
        //引用两孔插头对象 使得客户端可以通过适配器使用两孔插头的行为
        private TwoHole1 hole = new TwoHole1();
        public void Request()
        {
            hole.SpecificRequest();
        }
    }

 

     static void Main(string[] args)
        {//(对象的适配器)
            IThreeHole hole1 = new PowerAdapter1();
            hole1.Request();
            Console.Read();
        }

类适配器优点

1.在不修改原有代码的基础上复用现有类,很好的复合了“开闭原则”

2.可以重新定义被适配器类的部分行为,因为适配器类是被适配器类的子类

缺点:当适配器类匹配被适配器类及它的所有子类时,因为C#中类不能被多继承,所以用类的适配器模式是实现不了的。两个类耦合度较高。

对象适配器优点

1.相比类适配器模式的优点,对象适配器采用“对象组合”的方式,更加的“松耦合”lll

缺点:重定义被适配器类的行为较困难,这时就需要生成被适配器的子类,并引入被适配器的子类而不是被适配器类

 

使用场景:复用一些现有的类,但是接口又与现有环境不一致的情况,如.NET类库提供的适配器DataAdapter。

本文关于设计模式之适配器模式的学习就到这里了,结构型设计模式更加关注类或者对象组合成的结构及依赖关系。

文中如有不足,欢迎斧正,感谢您的阅读。

转载于:https://www.cnblogs.com/jdzhang/p/6994504.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值