设计模式之接口编程:
在面向对象编程中,有时会遇到一种情况,每一个基类及派生类都具有某种行为,但该种行为因其所属的类别不同而不同,如果仅仅有这两个条件的限制,我们可以采用面向对象编程中的继承与虚函数的特性,将该函数在基类中设置为虚函数,在派生类只需要重载该行为即可:
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();
}
}
}
分享到:
相关推荐
通过本例子理解工厂模式和面向接口编程,并更好理解接口的使用
设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。...整个设计模式贯穿一个原理:面对接口编程,而不是面对实现。目标原则是:降低耦合,增强灵活性。
针对接口编程,实现设计模式的鸭子模式,代码有很好的灵活性,并可进行好的封装
1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...
设计模式是一套被重复使用的代码设计经验的总结,本书面向有一定Java语言基础和一定编程经验的读者。旨在培养读者良好的设计模式思维方式,加强对面向对象思想的理解。全书共分12章,首先强调了接口和抽象类在设计...
针对接口编程的使能工具
面向对象编程 接口与设计模式.ppt
本项目对数据库进行增删改查四个操作,但不管数据库中有几个表,均调用add,del,update,sel这四个方法,这一切都通过继承和多态来完成,...重点在底层代码,可帮助大家深入理解面向对象编程中的继承,多态,面向接口的具体使用
这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一种创建型设计模式,它的主要目标是确保一个类在任何情况下都只有一个...
设计模式实用思想,设计模式的三个重要原则 一,针对接口编程,而不是针对实现编程 二,优先使用对象组合,而不是类继承 三,封装变化点
设计模式并不要求使用独特的语言特性,也不采用那些足以使你的朋友或老板大吃一惊的神奇的编程技巧。所有的模式均可以用标准的面向对象语言实现,这也许有时会比特殊的解法多费一些功夫,但是为了增加软件的灵活性...
设计模式并不要求使用独特的语言特性,也不采用那些足以使你的朋友或老板大吃一惊的神奇的编程技巧。所有的模式均可以用标准的面向对象语言实现,这也许有时会比特殊的解法多费一些功夫,但是为了增加软件的灵活性...
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类...
面向接口编程详解(三)——模式研究讲解几个设计模式中的面向接口思想和基于.NET平台的分层架构中的面向接口思想,加深理解。面向接口编程详解(一)——思想基础我想,对于各位使用面向对象编程语言的程序员来说,...
《asp.net设计模式》涵盖了开发企业级asp.net应用程序的知名模式和最佳实践。本书用到的模式可以用于从asp.net1.0到asp.net 4.0的任何版本。不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。 ...
这个是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 使用多个隔离的借口来降低耦合度。 5、迪米特法则(最少知道原则)(Demeter Principle...
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类...
OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码《Objective-C编程之道:iOS设计模式解析》是基于iOS的软件开发指南。书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,...
整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增 强灵活性. 1:前言 学习GoF 设计模式的重要性 建筑和软件中模式之异同 2:GoF 设计模式 A.创建模式 设计模式之Factory(工厂...