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