为了账号安全,请及时绑定邮箱和手机立即绑定

设计模式之美:Dynamic Property(动态属性)

标签:
架构

索引

  • 别名

  • 意图

  • 结构

  • 参与者

  • 适用性

  • 效果

  • 实现

    • 实现方式(一):Dynamic Property 的示例实现。

别名

  • Property

  • Properties

  • Property List

意图

使对象可以为客户提供广泛且可扩展的属性集合。

Lets an object provides a generic and extensible set of properties to clients.

结构

参与者

Object

  • 目标对象可存储 Property 列表。

  • 可使用不同的类型来作为 Property 的标识符,最简单的可以使用 string 类型。

Property

  • 属性定义。

适用性

当以下情况成立时可以使用 Dynamic Property 模式:

  • 当对象需要定义大量属性时。

  • 当对象的属性是运行时可变时。

效果

  • 可在运行时动态的修改对象的属性。

实现

实现方式(一):Dynamic Property 的示例实现。

复制代码

  1 namespace DynamicPropertyPattern.Implementation1  2 {  3   public class Person  4   {  5     private PropertyList _properties = new PropertyList(null);  6   7     public Property GetProperty(string propertyName)  8     {  9       return _properties.GetProperty(propertyName); 10     } 11  12     public bool HasProperty(string propertyName) 13     { 14       return _properties.HasProperty(propertyName); 15     } 16  17     public void AddProperty(string propertyName, Property property) 18     { 19       _properties.AddProperty(propertyName, property); 20     } 21  22     public void RemoveProperty(string propertyName) 23     { 24       _properties.RemoveProperty(propertyName); 25     } 26  27     public IEnumerable<Property> GetAllProperties() 28     { 29       return _properties.GetAllProperties(); 30     } 31   } 32  33   public class Property 34   { 35     public string Name { get; set; } 36     public string Value { get; set; } 37   } 38  39   public class PropertyList 40   { 41     private PropertyList _parent; 42     private Dictionary<string, Property> _properties 43       = new Dictionary<string, Property>(); 44  45     public PropertyList(PropertyList parent) 46     { 47       _parent = parent; 48     } 49  50     public PropertyList Parent 51     { 52       get 53       { 54         return _parent; 55       } 56     } 57  58     public Property GetProperty(string propertyName) 59     { 60       if (_properties.ContainsKey(propertyName)) 61         return _properties[propertyName]; 62       if (_parent != null && _parent.HasProperty(propertyName)) 63         return _parent.GetProperty(propertyName); 64       return null; 65     } 66  67     public bool HasProperty(string propertyName) 68     { 69       return (_properties.ContainsKey(propertyName)) 70         || (_parent != null && _parent.HasProperty(propertyName)); 71     } 72  73     public void AddProperty(string propertyName, Property property) 74     { 75       _properties.Add(propertyName, property); 76     } 77  78     public void RemoveProperty(string propertyName) 79     { 80       _properties.Remove(propertyName); 81     } 82  83     public IEnumerable<Property> GetAllProperties() 84     { 85       List<Property> properties = new List<Property>(); 86  87       if (_parent != null) 88         properties.AddRange(_parent.GetAllProperties()); 89  90       properties.AddRange(_properties.Values); 91  92       return properties; 93     } 94   } 95  96   public class Client 97   { 98     public void TestCase1() 99     {100       Person dennis = new Person();101       dennis.AddProperty("Contact", new Property() { Name = "Contact", Value = "Beijing" });102       dennis.AddProperty("Age", new Property() { Name = "Age", Value = "18" });103       dennis.AddProperty("Gender", new Property() { Name = "Gender", Value = "Male" });104 105       if (dennis.HasProperty("Contact"))106       {107         Property property = dennis.GetProperty("Contact");108       }109     }110   }111 }

复制代码

《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消