2011-03-24 47 views
1

在现实世界中,人们用它来解决什么类型的问题?我可以看到这些协同工作的示例代码吗?我能找到的所有代码都是关于猫狗说话或喝牛奶或咖啡的人的代码...Java中的多态性和接口(可以使用多态性来实现接口......为什么?)

人们是否真的实现了接口的多态性?做什么的?

+4

要使用猫和狗的例子(叹气,我知道)... **不要以为把猫变成狗。**想想像对待任何其他动物一样对待猫。这样,如果有人决定给你一天狗,你可以做同样的事情,你会与猫。 “饲料(食物f)”。 '确保BathroomCapabilities()'。玩它(玩具t)'。不要对猫做一些你不能对狗做的事。 – corsiKa 2011-03-24 18:21:55

+1

阅读维基百科的设计模式。它们非常有用,并且通常使用接口http://en.wikipedia.org/wiki/Design_pattern_(computer_science) – Kurru 2011-03-31 19:11:51

回答

9

当然,

下面是“观察家报”的图案的具体例子,使用的类和接口来实现多态行为记录仪系统:

public static void main(String [] args){ 

    Log myLog(); 
    FileLogger myFile(); 
    ConsoleLogger myConsole(); 

    myLog.registerLogger(myFile);  
    myLog.registerLogger(myConsole); 

    myLog.log("Hello World!!"); 
    myLog.log("Second log event!"); 
} 

希望这有助于你的INTERF的理解:

interface ILogger{ 

    public void handleEvent (String event); 
} 

class FileLogger implements ILogger{ 

    public void handleEvent (String event){ 
     //write to file 
    } 
} 

class ConsoleLogger implements ILogger{ 

    public void handleEvent (String event){ 
     System.out.println(event); 
    } 
} 

class Log { 

    public void registerLogger (ILogger logger){ 

     listeners.add(logger); 
    } 

    public void log (String event){ 

     foreach (ILogger logger in listeners){ 

      logger.handleEvent(event); //pass the log string to both ConsoleLogger and FileLogger! 
     } 
    } 

    private ArrayList<ILogger> listeners; 
} 

然后,你可以按如下方式使用它ace和多态。

1

查看Map/AbstractMap/HashMap的代码为例。你会发现成千上万的其他例子,其中自带的JDK(在src.zip)的JDK源

7
Map<String,Person> peopleByName = new HashMap<String,Person>(); 

如果,在路上,我决定的HashMap的内存开销实在是太多了,我可以重新做到这一点作为一个TreeMap,并用稍贵查找时间

Map<String,Person> peopleByName = new TreeMap<String,Person>(); 

生活因为peopleByName是一个地图,而不是一个TreeMap或HashMap的,我所有的电话都保证无论是地图上的工作,无论执行。

这最好用下面的例子

public class CatsAndDogsDrinkingMilkAndCoffee { 

    // what, no? :-(

} 
4
interface Request { 
    Response execute(); 
} 
interface Response { 
    String serialize(); 
} 
class RequestProcessor { 
    void processRequest(Request r) { 
    logger.log("Request: " + r); 
    Response s = r.execute(); 
    logger.log("Response: " + s); 
    connectionManager.write(r.serialize()); 
    } 
} 

说,在这个例子中所示,RequestProcesor并不需要知道请求和响应实现

1

想象“某人”设计了一个庞大的程序,有很多代码。假设“某人”在某些控制器逻辑的设计中使用了接口。现在你被聘用来处理你以前从未见过的代码。你被要求设计一个新的控制器类。你现在需要做的就是实现接口并使其所有方法都能正常工作。

如果有人没有使用接口,那么您不仅需要重新设计控制器,而且可能需要重新设计整个项目,因为控制器类和其他类之间存在非常强的耦合。这将花费你几个月的时间来理解代码,更不用说可能会引入的新的一组错误了。

1

几乎任何带有GUI的Java应用程序都使用它(但当然不仅仅是GUI ...)。例如,看看android VideoView源(这是第一次在我脑海...)

1

我对“真实世界”的另一个建议是使用spring批处理。如果您有一种常用的报告格式,例如“拉取数据,创建报告,发送给收件人”等模式,您可以为报告创建一个强制执行此标准的界面。从这个意义上说,它就像所有批量报告遵循的“模板”一样。

的镗例子,但它的东西,我在面对我的第一年......

0

你想知道如何LINQ在.net中的作品?这完全是关于接口和多态的。

你需要在项目上工作,然后你会了解所有这些。