首页 > 代码库 > 设计模式之美:Dynamic Property(动态属性)

设计模式之美: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 = http://www.mamicode.com/"Beijing" });
102       dennis.AddProperty("Age", new Property() { Name = "Age", Value = http://www.mamicode.com/"18" });
103       dennis.AddProperty("Gender", new Property() { Name = "Gender", Value = http://www.mamicode.com/"Male" });
104 
105       if (dennis.HasProperty("Contact"))
106       {
107         Property property = dennis.GetProperty("Contact");
108       }
109     }
110   }
111 }

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