设计模式之接口编程

设计模式之接口编程:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值