[Visual Studio & Xamarin] 开发架构(一)-IOC 翻转控制

转载 2014年06月16日 15:49:51
最近在工作上像克拉克請益學習了許多Design Pattern,也開始著手將克拉克建議的架構要引入
iOS與Android的開發。在把這些架構帶入iOS與Android之前,第一篇就來個IOC
架構的研究,接著再一步步把這些架構引入跨平台開發。
 
IOC(Inversion of Control)的字面翻譯是反轉控制,用來去除物件與外部物件的相依性。
….再講甚麼亂七八糟的東西…沒關係,
這一篇就用三國無雙遊戲來解釋這個範例好了,這樣可能比較好懂吐舌头.
 
想像一下,我們要開發一個三國無雙的遊戲,
我們新建一個主控台應用程式,就想像這個主控台應用程式是PS3的搖桿。

接著想像你在玩三國無雙的時候,你的搖桿操縱著武將,他們之間的相依性可以用下圖來表示。

在專案中,我先建立一個類別,類別名稱叫做關羽。
01 //關羽類別
02   public class GuanYu
03   {
04       //小攻擊
05       public void hit()
06       {
07           Console.WriteLine("關刀砍一下");
08       }
09       //無雙
10  
11       public void maxhit()
12       {
13           Console.WriteLine("關刀砍阿..砍阿..砍阿..踹一腳..砍阿砍阿ㄚㄚㄚㄚㄚㄚ!!!!!!!!");
14       }
15   }
在主控台程式中,撰寫底下的程式,建立關羽類別的實例,然後呼叫他的方法。
再提醒一下,這個主控台程式就是那隻PS搖桿喔!!
01 static void Main(string[] args)
02  
03 {
04  
05 GuanYu guanyu = new GuanYu();
06 Console.WriteLine("按下PS搖桿的○按鈕");
07 guanyu.hit();
08        Console.WriteLine("按下PS搖桿的□按鈕");
09     guanyu.maxhit();
10  
11 }
編譯程式可以看到底下的畫面程式呼叫了關羽類別。

但是當我們要在新增一個趙雲類別,問題開始產生了…

趙雲跟關羽一樣有小攻擊或者是無雙攻擊,在主要的主控台程式當中,
我們如果要判斷現在用的武將是那一個,這直接影響到畫面的呈現,
你到底用那一個武將,你按下無雙大絕招攻擊的時候,是呼叫那個武將類別來放大絕招?
程式就會變成下方這個樣子
01 Console.WriteLine("判斷目前使用的人物,選1是關羽,選2是趙雲。");
02  
03             string player = Console.ReadLine();
04             //選關羽的話
05             if (player == "1")
06             {
07                 GuanYu guanyu = new GuanYu();
08                 Console.WriteLine("按下PS搖桿的○按鈕");
09                 guanyu.hit();
10                 Console.WriteLine("按下PS搖桿的□按鈕");
11                 guanyu.maxhit();
12             }
13  
14             else if (player == "2")
15             {
16                 ZhaoYun zhaoyun = new ZhaoYun();
17                 Console.WriteLine("按下PS搖桿的○按鈕");
18                 zhaoyun.hit();
19                 Console.WriteLine("按下PS搖桿的□按鈕");
20                 zhaoyun.maxhit();
21             }
22  
23             Console.ReadLine();

多加了一個趙雲,就必須在Main類別中多加這麼多程式碼,如果再加入張飛,劉備….所有三國無雙的武將的話,
那這個程式可能就沒完沒了……

所以接下來我們稍作修正,去除掉物件依賴關係,把搖桿物件(主控台程式)與
武將類別的相依性去除掉。

新增一個Human的抽象類別,你可以想像三國無雙的武將們都是繼承這個抽象類別,
然後我在這個抽象類別中宣告了方法,所有武將都是繼承這個抽象類別,
最後再去複寫抽象方法。這樣每個人的無雙大絕招的內容也就會不一樣。
1 //宣告人物的抽象類別
2 public abstract class Human
3 {
4     //宣告小攻擊的抽象方法,必須要在繼承的類別中實作
5     public abstract void hit();
6     //宣告無雙的抽象方法,必須要在繼承的類別中實作
7     public abstract void maxhit();
8 }


繼承抽象類別後,各個類別再去實作方法內容,
01 //關羽類別
02  public class GuanYu : Human
03  
04  {
05      //小攻擊
06      public override void hit()
07      {
08          Console.WriteLine("關刀砍一下");
09      }
10  
11      //無雙
12      public override void maxhit()
13      {
14          Console.WriteLine("關刀砍阿..砍阿..砍阿..踹一腳..砍阿砍阿ㄚㄚㄚㄚㄚㄚ!!!!!!!!");
15      }
16  
17  }<span style="font-family: Arial, Verdana, sans-serif;"> </span>
 
01 //趙雲類別
02 public class ZhaoYun : Human
03  
04 {
05     //小攻擊
06     public override void hit()
07  
08     {
09         Console.WriteLine("長槍~我戳");
10     }
11     //無雙
12     public override void maxhit()
13     {
14         Console.WriteLine("長槍戳阿..戳阿..戳阿..踹一腳..戳阿戳阿ㄚㄚㄚㄚㄚㄚ!!!!!!!!");
15     }
16  
17 }
 
view source
print
?
01 //張飛類別
02 public class ZhangFei : Human
03 {
04     //小攻擊
05     public override void hit()
06     {
07         Console.WriteLine("蛇矛~我刺");
08     }
09     //無雙
10     public override void maxhit()
11     {
12         Console.WriteLine("蛇矛我刺..刺阿..刺阿..踹一腳..刺阿刺阿ㄚㄚㄚㄚㄚㄚ!!!!!!!!");
13     }
14 }
接著就是生成物件,在克拉克極簡風格的依賴注入模組 (DI Framework)一文中提到
一般業界常見的DI Framework,可以被分類為兩大種類:讀取DLL生成物件、讀取Config生成物件。
在這系列的範例我是以Factory的方式來生成與注入物件,除了這種方式我比較習慣外,
相對Xamarin.android 與 Xamarin.ios來說,使用Factory的方式來生成物件會比
使用讀取Config來生成物件來得稍微單純。其實就看你個人比較習慣那種用法了,榔頭鐵鎚用的順手最重要。
 
 
所以我建立了一個工廠類別,可以用來想像,其實前端要使用到武將類別,只要告訴我你要用誰,
就像三國無雙一開始在選單上選你要使用的武將一樣,這個工廠類別就出貨給你。
01 static class HumanFactory
02  
03     {
04         public static Human Getactor(string actor)
05         {
06             switch (actor)
07             {
08                 case "1":
09                     return new GuanYu(); //回傳關羽物件
10                 case "2":
11                     return new ZhaoYun();//回傳趙雲物件
12                 case "3":
13                     return new ZhangFei();//回傳張飛物件
14                 default:
15                     return null;
16             }
17  
18         }
19  
20     }
回到主控台程式,修改程式如下,當我們要使用那一個角色的,我們只要對工廠類別下訂單,
接著工廠類別會給我們相對應的武將,接下來我們就可以使用這個物件了,這樣程式碼變簡潔許多。
01 Console.WriteLine("判斷目前使用的人物,選1是關羽,選2是趙雲,3是張飛。");
02  
03 string actor = Console.ReadLine();
04  
05 var actorobj = HumanFactory.Getactor(actor);
06  
07 Console.WriteLine("按下PS搖桿的○按鈕");
08  
09 actorobj.hit();
10  
11 Console.WriteLine("按下PS搖桿的□按鈕");
12  

13 actorobj.maxhit();



在mac上为unity开发安装xamarin studio

最近有了那么个契机,有机会把自己的工作平台从windows上转移到了mac上,一开始我是忐忑的,因为mac上做unity开发是没有像visual studio这样的神器呀! 直到我知道了 xamar...
  • WPAPA
  • WPAPA
  • 2017年02月20日 23:50
  • 1796

Visual Studio 跨平台开发实战--- Hello Xamarin! [Visual Studio + C# + Xamarin = iOS/Android/Windows Apps ]

前言 應用程式發展的腳步,從來沒有停過。從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再到近幾年相當盛行的行動裝置應用程式 (Mobile Application),身為...
  • kingmax54212008
  • kingmax54212008
  • 2014年02月02日 21:56
  • 4913

visual studio 2017 xamarin 的性能小疑问

好久没写了博客了,今天休息终于狠心配置了电脑性能还不错,于是安装了WIN10+VS2017 15.2 打开XMARIN的一个例子程序进行生成,发现性能方面有待提高啊,第1是VS2017默认选择微软的模...
  • hecgaoyuan
  • hecgaoyuan
  • 2017年05月14日 14:24
  • 1714

使用Xamarin+Visual Studio搭建Android开发环境

本文介绍使用xamarin和visual studio配置Android开发环境,并且最终完成使用C#语言开发Android程序的目的。目前Xamarin提供了开发Android和IOS的简化模式,使...
  • dh858115
  • dh858115
  • 2017年01月08日 20:54
  • 849

Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

 Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验。 1,卸载visual studio 2015 虽然可以同时安装visual...
  • andyhebear
  • andyhebear
  • 2016年12月21日 11:37
  • 2812

透彻理解IoC(控制反转)

 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP、声明式事务等功能在此基础上开花结果。但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,...
  • u014563989
  • u014563989
  • 2017年02月15日 09:26
  • 7143

使用Xamarin + C#开发应用 -- 使用sqlite做本地存储

使用Xamarin + C#开发应用 -- 使用sqlite做本地存储
  • csharp25
  • csharp25
  • 2015年05月06日 23:01
  • 1986

JAVA菜鸟学习日记——简单代码实现IOC控制反转

原来校招时候的时候刷过一道题——写段代码实现控制反转,现在终于有了些思路~自己留念,同时分享给大家。...
  • Autobot_song
  • Autobot_song
  • 2016年12月22日 20:08
  • 1119

用Visual studio和Xamarin构建移动开发平台

操作系统:windows 7、 windows server 2008。 1.下载安装Visual Studio 2015,不详述。 2.打开https://www.xamarin.com/pla...
  • jhycjhyc
  • jhycjhyc
  • 2017年01月12日 23:15
  • 723

Visual Studio 2013支持Xamarin的解决方案

转自博客园[遗忘的代码]     Xamarin的Visual Studio插件目前还不支持VS 2013,所以需要在安装Xamarin的VS插件时把2010和2012全选上 (由于我的电脑里只剩20...
  • Raywang80s
  • Raywang80s
  • 2017年07月10日 14:17
  • 330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Visual Studio & Xamarin] 开发架构(一)-IOC 翻转控制
举报原因:
原因补充:

(最多只允许输入30个字)