设计模式之接口编程

设计模式之接口编程:

在面向对象编程中,有时会遇到一种情况,每一个基类及派生类都具有某种行为,但该种行为因其所属的类别不同而不同,如果仅仅有这两个条件的限制,我们可以采用面向对象编程中的继承与虚函数的特性,将该函数在基类中设置为虚函数,在派生类只需要重载该行为即可:
class Base
{
    virtual void f(){};
}

class Derived1:Base
{
    void f();
}

class Dervied2:Base
{
    void f();
}

.......

可是,这也带来一个问题,如果继承层次较为复杂,派生类较多,那岂不是说要为某一个派生类都要编写一个f()函数?当然如果对于不同的派生类而言,其f()函数实现各别,那这样做是可行的,但如果f()函数只有简单的几种呢,这样做,是不是代码冗余太多了?

对于这种情况,我们可以采用实现接口的方法,定义接口类,并将方法的实现一一写入接口的实现中,将接口定义在基类中,在派生类中对接口进行实例化,需要什么类型的实现,便使用什么类型的接口实现函数。

如此,这避免了代码冗余,并且,易于扩展。

如下是Head First设计模式中经典实例(C#实现):

namespace DesignPattern_1
{
    //Fly的接口
        public interface FlyBehavior
        {
                void fly();
        }

    //Quack的接口
        public interface QuackBehavior
        {
                void quack();
        }

    //Fly接口的一种实现形式
        public class FlyWithWings : FlyBehavior
        {
                #region FlyBehavior Members

                public void fly()
                {
                        Console.WriteLine("I'm flying!!");
                }

                #endregion
        }

    //Fly接口的一种实现形式
        public class FlyNoWay : FlyBehavior
        {
                #region FlyBehavior Members

                public void fly()
                {
                        Console.WriteLine("I can't fly!!");
                }

                #endregion
        }

    //Fly接口的一种实现形式
        public class FlyRocketPowered : FlyBehavior
        {
                #region FlyBehavior Members

                public void fly()
                {
                        Console.WriteLine("I'm flying with a rocket!");
                }

                #endregion
        }

    //Quack接口的一种实现形式
        public class Quack : QuackBehavior
        {

                #region QuackBehavior Members

                public void quack()
                {
                        Console.WriteLine("Quack");
                }

                #endregion
        }

    //Quack接口的一种实现形式
        public class MuteQuack : QuackBehavior
        {
                #region QuackBehavior Members

                public void quack()
                {
                        Console.WriteLine("Silence");
                }

                #endregion
        }

    //Quack接口的一种实现形式
        public class Squeak : QuackBehavior
        {
                #region QuackBehavior Members

                public void quack()
                {
                        Console.WriteLine("Squeak");
                }

                #endregion
        }

    //Duck的抽象类
         public abstract class Duck
         {
                 protected FlyBehavior flyBehavior; //Fly接口
                 protected QuackBehavior quackBehavior; //Quack接口
                 public Duck() { }

                 public abstract void display();

                 public void performFly()
                 {
                         flyBehavior.fly();
                 }

                 public void performQuack()
                 {
                         quackBehavior.quack();
                 }

                 public void setFlyBehavior(FlyBehavior fb)
                 {
                         flyBehavior = fb;
                 }

                 public void setQuackBehavior(QuackBehavior qb)
                 {
                         quackBehavior = qb;
                 }
         }

    //Duck的一种派生类
         public class MallardDuck : Duck
         {
                 public MallardDuck()
                 {
                         quackBehavior = new Quack();
                         flyBehavior = new FlyWithWings();
                 }

                 public override void display()
                 {
                         Console.WriteLine("I'm a real Mallard duck");
                 }
         }

    //Duck的一种派生类
         public class ModelDuck : Duck
         {
                 public ModelDuck()
                 {
                         flyBehavior = new FlyNoWay();
                         quackBehavior = new Quack();
                 }

                 public override void display()
                 {
                         Console.WriteLine("I'm a model duck");
                 }
         }
         class Program
        {
                static void Main(string[] args)
                {
                        Duck model = new ModelDuck();
                        model.performFly();
                        model.performQuack();
                        model.setFlyBehavior(new FlyRocketPowered());
                        model.performFly();       
                        Console.ReadKey();
                }
        }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值