您的位置:首页 > 运维架构 > 网站架构

.net 的动态语言实现DCI架构模式的角色混入

2012-11-03 15:45 363 查看
DCI机构模式实现很重要的一个特性就是同一个PPT在不同context中的Role混入。

若采用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
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: