适配器模式(Adapter Pattern)

适配器模式解析
本文通过将火鸡适配为鸭子的例子,介绍了适配器模式的两种实现方式:对象适配器和类适配器,并对比了它们各自的优缺点。

适配器模式:如何将一个方块放进一个圆洞中。

namespace 设计模式.适配器模式.目标接口(Target)
{
    //鸭子的接口
    public interface Duck
    {
         void quack();


         void fly();
    }

    public class MallardDuck : Duck
    {


        public void quack()
        {
            //“嘎嘎嘎”
            System.Windows.Forms.MessageBox.Show("Quack");
        }


        public void fly()
        {
            //"飞行一大段"
            System.Windows.Forms.MessageBox.Show("I'm flying");
        }
    }
}


namespace 设计模式.适配器模式.需要适配的类(Adaptee)
{
    //火鸡的接口
    public interface Turkey
    {
         //咯咯叫
         void gobble();

        //飞行
         void fly();
    }

    //野火鸡对象
    public class WildTurkey : Turkey
    {

        
        public void gobble()
        {
            //“咯咯咯”
            System.Windows.Forms.MessageBox.Show("Gobble gobble");
        }


        public void fly()
        {
            //“飞行一小段”
            System.Windows.Forms.MessageBox.Show("I'm flying a short distance");
        }
    }
}

namespace 设计模式.适配器模式.适配器(Adapter)
{
    //用火鸡实现鸭子的对象适配器
    public class TurkeyAdapter : Duck
    {
        Turkey turkey;
        //构造时可动态传入一种火鸡类(对象适配器的优点)
        public TurkeyAdapter(Turkey turkey)
        {
            this.turkey = turkey;
        }
        //使用火鸡的叫声
        public void quack()
        {
            turkey.gobble();
        }


        public void fly()
        {
            //假设火鸡飞行5次相当于鸭子飞行一次
            for (int i = 0; i < 5; i++)
            {
                turkey.fly();
            }
        }
    }
    //用火鸡实现鸭子的类适配器
    public class ClassAdapter : WildTurkey, Duck
    {
        //使用WildTurkey的"gobble()"方法实现
        public void quack()
        {
            base.gobble();
        }

        //覆盖WildTurkey类中的"fly()"方法
        new public void fly()
        {
            for (int i = 0; i < 5; i++)
            {
                base.fly();
            }
        }
    }
}

总结:

1.对象适配器不仅可以适配某个类,也可以适配该类的任何子类;类适配器则不需要重新实现整个适配者,还可以覆盖被适配者的行为。

2.对象适配器弹性好,但相对的,他需要两个类配合工作;类适配器则仅仅需要一个适配器对象,但弹性较差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值