Java是如何快速煮成C 的 (一) 相似的方法 2
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
在上篇《Java是如何快速煮成C#的?》(一):相似的方法》中,我們開啟了C#與Java中的話題之一:相似的方法。本節我們再舉例說明,到底有多相似。
我們用一個簡單的工廠模式的例子說明,順便複習下設計模式,呵呵。
首先邀月得補充一下:
1、語言對比:Java的檔名必須與類名匹配。在Java中,檔名必須遵循類的名稱。在C#中,雖然通常如此,但不是必需的。在C#中,可以有兩個class在一個檔案中,並且從C#2.0開始,可能有一個Class跨越多個檔案。
2、簡單工廠(Simple Factory)模式
Simple Factory模式根據提供給它的資料,返回幾個可能類中的一個類的例項。通常它返回的類都有一個公共的父類和公共的方法。
好了,我們看一個C#/Java的類圖
就類圖本身而言,除了String與string的大小寫之外,並無區別。兩個圖均用Powerdesigner所畫,只是依據模板分別為c#2.0和Java。
基類:Namer
派生類:FirstFirst和LastFirst均繼承Namer
NameFactory實現了Namer的Create方法,在本例中為getName()。
程式碼對比如下:
Namer(C#):
- using System;
- namespace NameFactory
- {
- /// <summary>
- /// Summary description for Namer.
- /// </summary>
- //Base class for getting split names
- public class Namer
- {
- //parts stored here
- protected string frName, lName;
- //return first name
- public string getFrname()
- {
- return frName;
- }
- //return last name
- public string getLname()
- {
- return lName;
- }
- }
- }
Namer(Java):
[java] view plain copy print ?- package com.factory.SimpleFactory;
- public class Namer {
- protected String frName, lName;
- //return first name
- public String getFrname()
- {
- return frName;
- }
- //return last name
- public String getLname()
- {
- return lName;
- }
- }
FirstFirst(C#):
[c-sharp] view plain copy print ?- using System;
- namespace NameFactory
- {
- /// <summary>
- /// Summary description for FirstFirst.
- /// </summary>
- public class FirstFirst : Namer
- {
- public FirstFirst(string name)
- {
- int i = name.IndexOf(" ");
- if (i > 0)
- {
- frName = name.Substring(0, i).Trim();
- lName = name.Substring(i + 1).Trim();
- }
- else
- {
- lName = name;
- frName = "";
- }
- }
- }
- }
FirstFirst(Java):
[java] view plain copy print ?- package com.factory.SimpleFactory;
- public class FirstFirst extends Namer {
- public FirstFirst(String name) {
- int i = name.indexOf(" ");
- if (i > 0) {
- frName = name.substring(0, i).trim();
- lName = name.substring(i + 1).trim();
- } else {
- lName = name;
- frName = "";
- }
- }
- }
LastFirst(C#):
[c-sharp] view plain copy print ?
- using System;
- namespace NameFactory
- {
- /// <summary>
- /// Summary description for LastFirst.
- /// </summary>
- public class LastFirst : Namer
- {
- public LastFirst(string name)
- {
- int i = name.IndexOf(",");
- if (i > 0)
- {
- lName = name.Substring(0, i);
- frName = name.Substring(i + 1).Trim();
- }
- else
- {
- lName = name;
- frName = "";
- }
- }
- }
- }
LastFirst(Java):
[java] view plain copy print ?- package com.factory.SimpleFactory;
- public class LastFirst extends Namer {
- public LastFirst(String name) {
- int i = name.indexOf(",");
- if (i > 0) {
- lName = name.substring(0, i);
- frName = name.substring(i + 1).trim();
- } else {
- lName = name;
- frName = "";
- }
- }
- }
NameFactory(C#):
[c-sharp] view plain copy print ?- using System;
- namespace NameFactory
- {
- /// <summary>
- /// Summary description for NameFactory.
- /// </summary>
- public class NameFactory
- {
- public NameFactory() { }
- public Namer getName(string name)
- {
- int i = name.IndexOf(",");
- if (i > 0)
- return new LastFirst(name);
- else
- return new FirstFirst(name);
- }
- }
- }
NameFactory(Java):
[java] view plain copy print ?- package com.factory.SimpleFactory;
- public class NameFactory {
- public NameFactory() {
- }
- public Namer getName(String name) {
- int i = name.indexOf(",");
- if (i > 0)
- return new LastFirst(name);
- else
- return new FirstFirst(name);
- }
- }
測試方法:(C#):
[c-sharp] view plain copy print ?- using System;
- using System.Text;
- namespace NameFactory
- {
- class Program
- {
- static string s;
- private static NameFactory nameFact;
- static void Main(string[] args)
- {
- System.Console.WriteLine("please enter a string:");
- s = Console.ReadLine();
- //s="zhang,tony";
- ShowFactoryName(s);
- Console.ReadKey();
- }
- static void ShowFactoryName(String input)
- {
- System.Console.WriteLine("input:" + input);
- nameFact = new NameFactory();
- Namer nm = nameFact.getName(input);//此處可以用反射,類似於getClass方法
- System.Console.WriteLine("FirstName:" + nm.getFrname());
- System.Console.WriteLine("LastName:" + nm.getLname());
- }
- }
- }
(Java):
[java] view plain copy print ?- package com.factory.SimpleFactory;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class SimpleFactoryDemo1 {
- private static NameFactory nameFact;
- static String s;
- /**
- * @param args
- */
- /**
- * @param args
- */
- public static void main(String[] args) {
- System.out.println("please enter a string:");
- try {
- BufferedReader in = new BufferedReader(new InputStreamReader(
- System.in));
- s = in.readLine();
- } catch (IOException e) {
- }
- // s="zhang,tony";
- ShowFactoryName(s);
- }
- static void ShowFactoryName(String input) {
- System.out.println("input:" + input);
- nameFact = new NameFactory();
- Namer nm = nameFact.getName(input);// 此處可以用反射,類似於getClass方法
- System.out.println("FirstName:" + nm.getFrname());
- System.out.println("LastName:" + nm.getLname());
- }
- }
正常情況下,分別得出如下結果:
小結:從程式碼的比較中,大多數情況下,改下大小寫,程式碼就可以通用,只是名稱空間可能有較大差異。如果你熟悉c#所有的類,Java是否也感覺很容易呢?
下一篇:《Java是如何快速煮成C#的?》(二):資料訪問(1)
邀月注:本文版權由邀月和CSDN共同所有,轉載請註明出處。
助人等於自助! [email protected]