.net 的动态语言实现DCI架构模式的角色混入
2012-11-03 15:45
363 查看
DCI机构模式实现很重要的一个特性就是同一个PPT在不同context中的Role混入。
若采用Scala可以很好的支持此特性。
C#是否也可以支持此特性吗?
答案当然是肯定的。那就是采用.net 4.0 dynamic
我们看下面这个例子
在家时候,老公和老婆是父母角色,具有洗菜做饭的职责。
在单位时候,老公是售前支持角色,对外宣讲公司产品,老婆是室内设计师,进行公司室内装修设计
执行结果如下:
---------------在家场景---------------
老公在家洗白菜
老婆在家炒白菜
---------------上班场景---------------
老公在单位编写公司新产品幻灯片,客户那里宣讲公司新产品的幻灯片
老婆在单位进行2居室地中海风格的室内设计
场景类
PPT类
角色类
若采用Scala可以很好的支持此特性。
C#是否也可以支持此特性吗?
答案当然是肯定的。那就是采用.net 4.0 dynamic
我们看下面这个例子
在家时候,老公和老婆是父母角色,具有洗菜做饭的职责。
在单位时候,老公是售前支持角色,对外宣讲公司产品,老婆是室内设计师,进行公司室内装修设计
void Main() { List<People> peoples = new List<People>() { new People(PeopleName.老婆.ToString()),new People(PeopleName.老公.ToString()) }; List<Role> roles = new List<Role>() { new Chef(),new Assitant(),new SaleSupporter(),new DrawDesigner() }; Console.WriteLine("---------------在家场景---------------"); AtHomeContext home = new AtHomeContext(); home.Intial(peoples,roles); home.AssignRole(); home.Cook("白菜"); Console.WriteLine("---------------上班场景---------------"); InOfficeContext office = new InOfficeContext(); office.Intial(peoples,roles); office.AssignRole(); office.DoWork(); }
执行结果如下:
---------------在家场景---------------
老公在家洗白菜
老婆在家炒白菜
---------------上班场景---------------
老公在单位编写公司新产品幻灯片,客户那里宣讲公司新产品的幻灯片
老婆在单位进行2居室地中海风格的室内设计
场景类
public abstract class Context { public List<People> peoples {get;private set;} public List<Role> roles {get;private set;} public void Intial(List<People> peoples,List<Role> roles) { this.peoples = peoples; this.roles = roles; } public abstract void AssignRole(); } public class InOfficeContext:Context { People 老婆 , 老公; Role supporter,designer; public override void AssignRole() { 老婆 = peoples.Where(p => p.Name == PeopleName.老婆.ToString()).FirstOrDefault(); 老公 = peoples.Where(p => p.Name == PeopleName.老公.ToString()).FirstOrDefault(); supporter = roles.Where(r => r.GetRole == RoleType.SaleSupporter).FirstOrDefault(); designer = roles.Where(r => r.GetRole == RoleType.DrawDesigner).FirstOrDefault(); 老婆.Role = designer; designer.People = 老婆; 老公.Role = supporter; supporter.People = 老公; } public void DoWork() { 老公.Role.PearchProductPPT("公司新产品"); 老婆.Role.Draw("2居室地中海风格"); } } public class AtHomeContext:Context { People 老婆 , 老公; Role chef,assitant; public override void AssignRole() { 老婆 = peoples.Where(p => p.Name == PeopleName.老婆.ToString()).FirstOrDefault(); 老公 = peoples.Where(p => p.Name == PeopleName.老公.ToString()).FirstOrDefault(); chef = roles.Where(r => r.GetRole == RoleType.Chef).FirstOrDefault(); assitant = roles.Where(r => r.GetRole == RoleType.Assitant).FirstOrDefault(); 老婆.Role = chef; chef.People = 老婆; 老公.Role = assitant; assitant.People = 老公; } public void Cook(string food) { 老公.Role.WashFood(food); 老婆.Role.Cook(food); } }
PPT类
public class People { public People(string name) { Name = name; } public string Name {get;private set;} public dynamic Role {get;set;} } public enum PeopleName { 老婆,老公 }
角色类
public abstract class Role { public People People{protected get;set;} public abstract RoleType GetRole{get;} } public class Chef:Role { public void Cook(string food) { Console.WriteLine(base.People.Name + "在家炒" + food); } public override RoleType GetRole { get{return RoleType.Chef;} } } public class Assitant:Role { public void WashFood(string food) { Console.WriteLine(base.People.Name + "在家洗" + food); } public override RoleType GetRole { get{return RoleType.Assitant;} } } public class SaleSupporter:Role { public void PearchProductPPT(string product) { Console.WriteLine(base.People.Name + "在单位编写" + product + "幻灯片,客户那里宣讲" + product + "的幻灯片"); } public override RoleType GetRole { get{return RoleType.SaleSupporter;} } } public class DrawDesigner:Role { public void Draw(string product) { Console.WriteLine(base.People.Name + "在单位进行" + product + "的室内设计"); } public override RoleType GetRole { get{return RoleType.DrawDesigner;} } } public enum RoleType { Chef,Assitant,SaleSupporter,DrawDesigner }
相关文章推荐
- [.NET 三层架构(ADO.NET)+Web Service+多语言]WinForm三层架构重新实现TaskVision,外加WebService提供数据和多语言
- .NET面向上下文、AOP架构模式(实现)
- .NET面向上下文、AOP架构模式(实现)
- 动态代理模式(抽象角色用接口形式,代理角色必须实现InvocationHandler)
- 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)
- .NET面向上下文、AOP架构模式(实现)
- 系统架构设计——设计模式之代理模式(二)CGLIB动态代理实现
- .NET面向上下文、AOP架构模式(实现)
- .NET 平台上动态语言实现 IronPython 1.0 Beta 1 完成
- .NET面向上下文、AOP架构模式(实现)
- Java基础之反射及动态代理,反射实现工厂模式
- 基于.NET平台的分层架构实战(八)——数据访问层的第二种实现:SQLServer+存储过程
- 基于.NET平台的分层架构实战(五)——接口的设计与实现
- 设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)
- Qt动态多语言的实现(VS2012开发)
- 2.0Tip/Trick之MessageBox, Popup, 循环的几种实现方法, 动态变换主题, 本地化(多语言), 响应鼠标双击事件
- 设计模式--JDK动态代理的实现与原理解析(1)
- .NET架构MVC5编程实现简易购物网站
- Spring架构详解之动态代理的实现原理
- 反射实现 AOP 动态代理模式