`
blogfeifei
  • 浏览: 1197940 次
文章分类
社区版块
存档分类
最新评论

设计模式之接口编程

 
阅读更多

设计模式之接口编程:

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

分享到:
评论

相关推荐

    工厂模式与面向接口编程例子

    通过本例子理解工厂模式和面向接口编程,并更好理解接口的使用

    设计模式 23种设计模式PPT

    设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。...整个设计模式贯穿一个原理:面对接口编程,而不是面对实现。目标原则是:降低耦合,增强灵活性。

    针对接口编程 java示例

    针对接口编程,实现设计模式的鸭子模式,代码有很好的灵活性,并可进行好的封装

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

    Java设计模式深入研究

    设计模式是一套被重复使用的代码设计经验的总结,本书面向有一定Java语言基础和一定编程经验的读者。旨在培养读者良好的设计模式思维方式,加强对面向对象思想的理解。全书共分12章,首先强调了接口和抽象类在设计...

    针对接口编程的使能工具

    针对接口编程的使能工具

    面向对象编程 接口与设计模式.ppt

    面向对象编程 接口与设计模式.ppt

    在.NET三层下模拟工厂模式实现面向接口编程(源代码带数据库)

    本项目对数据库进行增删改查四个操作,但不管数据库中有几个表,均调用add,del,update,sel这四个方法,这一切都通过继承和多态来完成,...重点在底层代码,可帮助大家深入理解面向对象编程中的继承,多态,面向接口的具体使用

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一种创建型设计模式,它的主要目标是确保一个类在任何情况下都只有一个...

    java设计模式导论

    设计模式实用思想,设计模式的三个重要原则 一,针对接口编程,而不是针对实现编程 二,优先使用对象组合,而不是类继承 三,封装变化点

    设计模式 GOF 23

    设计模式并不要求使用独特的语言特性,也不采用那些足以使你的朋友或老板大吃一惊的神奇的编程技巧。所有的模式均可以用标准的面向对象语言实现,这也许有时会比特殊的解法多费一些功夫,但是为了增加软件的灵活性...

    设计模式:可复用面向对象软件的基础--详细书签版

     设计模式并不要求使用独特的语言特性,也不采用那些足以使你的朋友或老板大吃一惊的神奇的编程技巧。所有的模式均可以用标准的面向对象语言实现,这也许有时会比特殊的解法多费一些功夫,但是为了增加软件的灵活性...

    24种设计模式介绍与6大设计原则

    这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类...

    面向接口编程详解

    面向接口编程详解(三)——模式研究讲解几个设计模式中的面向接口思想和基于.NET平台的分层架构中的面向接口思想,加深理解。面向接口编程详解(一)——思想基础我想,对于各位使用面向对象编程语言的程序员来说,...

    ASP.NET设计模式-杨明军译(源码)

    《asp.net设计模式》涵盖了开发企业级asp.net应用程序的知名模式和最佳实践。本书用到的模式可以用于从asp.net1.0到asp.net 4.0的任何版本。不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。  ...

    Java 设计模式

     这个是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle)  使用多个隔离的借口来降低耦合度。 5、迪米特法则(最少知道原则)(Demeter Principle...

    设计模式Demo

    这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码《Objective-C编程之道:iOS设计模式解析》是基于iOS的软件开发指南。书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,...

    设计模式(Patterns in Java)

    整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增 强灵活性. 1:前言 学习GoF 设计模式的重要性 建筑和软件中模式之异同 2:GoF 设计模式 A.创建模式 设计模式之Factory(工厂...

Global site tag (gtag.js) - Google Analytics