C# 设计模式7 适配器(Adapter)

参考:head first 设计模式

应用场景

有个第三方的接口,我们需要用,并要加入一些我们自己的功能。不想重新开发,或再开发难度大。
比如笔记本的电源适配器,三头转到电脑上的一个头;手机上的充电器;家里的烧水壶,三个插头,
通过一个三转二的适配器,插到家里的二孔插头上;板子等,都是适配器模式。

结构

目标接口:可以是抽象类或接口,我们需要的
适配者类:原有的接口或类,旧有的功能
适配器类:它是个转换器,通过继承接口(抽象类)或接口,来调用原有的东西

图例

在这里插入图片描述

特点

优点:
将原有对象加入到新环境中,无需重复再做原有的工作。使两个无法在一起工作的类能够一起工作。
不用改原有的代码,可利用原有类或接口。
仅引用了对象,即是优点也是缺点。

缺点:
类适配器更换麻烦,要改的东西要多些。
如果要适配一个类及它的子类的时候,类的适配器就不好搞了。

系统自带

.net调用com里面的东西
还有AbstractFactory中涉及的DbDataProviderFactory,它里面涉及到DbDataAdapter。
ADO.NET统一访问数据源,

代码
using System;

namespace DesignPattern
{
    public class AdapterPatternClient
    {
        public static void main()
        {
            //类的适配器
            IThreePlugin classAdapter = new PowerAdapter();
            classAdapter.Request();

            //对象的适配器
            ThreePlgin1 objectAdapter = new PowerAdapter1();
            objectAdapter.Request();
        }
    }

    //1接口适配器
    /// <summary>
    /// 三个孔的插头,就是适配器中的目标角色
    /// </summary>
    public interface IThreePlugin
    {
        void Request();
    }

    /// <summary>
    /// 原有的功能 两个孔的插头,源角色-需要适配的类
    /// </summary>
    public abstract class TwoPlugin
    {
        public void RequestOld()
        {
            Console.WriteLine("原有功能 2孔插头");
        }
    }

    /// <summary>
    /// 适配器类提供了三个孔插头的行为,本质是调用两个孔插头的方法
    /// </summary>
    public class PowerAdapter : TwoPlugin, IThreePlugin
    {
        public void Request()
        {
            //调用两个孔插头头方法
            this.RequestOld();
        }
    }
    //客户想用三孔插头,但不能直接调用,所以通过一个接口的转换重写来实现调用三孔插头的功能。
    //它就是一个壳子

    //2对象适配器
    /// <summary>
    /// 对象适配器 new一个对象,来引用它,从而调用它内部的东西
    /// </summary>
    //三个孔的插头,适配器模式中的Target目标角色
    public class ThreePlgin1
    {
        //客户端需要的方法
        public virtual void Request()
        {
            //这里放实现
        }
    }

    /// <summary>
    /// 两个孔的插头 源角色需要适配的类
    /// </summary>
    public class TwoPlugin1
    {
        public void RequestOld()
        {
            Console.WriteLine("原有功能 2孔插头");
        }
    }

    //适配器类 这里只引用TwoPlugin对象
    public class PowerAdapter1 : ThreePlgin1
    {
        //引用两个孔插头的实例,从而将客户端与TwoHole联系起来
        public TwoPlugin1 twoPluginAdapter = new TwoPlugin1();

        //实现三个孔插头接口的方法
        public override void Request()
        {
            twoPluginAdapter.RequestOld();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值