索引

别名

  • 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 的示例实现。

 namespace DynamicPropertyPattern.Implementation1
{
public class Person
{
private PropertyList _properties = new PropertyList(null); public Property GetProperty(string propertyName)
{
return _properties.GetProperty(propertyName);
} public bool HasProperty(string propertyName)
{
return _properties.HasProperty(propertyName);
} public void AddProperty(string propertyName, Property property)
{
_properties.AddProperty(propertyName, property);
} public void RemoveProperty(string propertyName)
{
_properties.RemoveProperty(propertyName);
} public IEnumerable<Property> GetAllProperties()
{
return _properties.GetAllProperties();
}
} public class Property
{
public string Name { get; set; }
public string Value { get; set; }
} public class PropertyList
{
private PropertyList _parent;
private Dictionary<string, Property> _properties
= new Dictionary<string, Property>(); public PropertyList(PropertyList parent)
{
_parent = parent;
} public PropertyList Parent
{
get
{
return _parent;
}
} public Property GetProperty(string propertyName)
{
if (_properties.ContainsKey(propertyName))
return _properties[propertyName];
if (_parent != null && _parent.HasProperty(propertyName))
return _parent.GetProperty(propertyName);
return null;
} public bool HasProperty(string propertyName)
{
return (_properties.ContainsKey(propertyName))
|| (_parent != null && _parent.HasProperty(propertyName));
} public void AddProperty(string propertyName, Property property)
{
_properties.Add(propertyName, property);
} public void RemoveProperty(string propertyName)
{
_properties.Remove(propertyName);
} public IEnumerable<Property> GetAllProperties()
{
List<Property> properties = new List<Property>(); if (_parent != null)
properties.AddRange(_parent.GetAllProperties()); properties.AddRange(_properties.Values); return properties;
}
} public class Client
{
public void TestCase1()
{
Person dennis = new Person();
dennis.AddProperty("Contact", new Property() { Name = "Contact", Value = "Beijing" });
dennis.AddProperty("Age", new Property() { Name = "Age", Value = "" });
dennis.AddProperty("Gender", new Property() { Name = "Gender", Value = "Male" }); if (dennis.HasProperty("Contact"))
{
Property property = dennis.GetProperty("Contact");
}
}
}
}

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

设计模式之美:Dynamic Property(动态属性)的更多相关文章

  1. Dynamic Property Wizard 添加类提示 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目 错误提示解决方式

    在重新打开OPM项目添加ATL动态属性向导Dynamic Property Wizard提示错误 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目. 有效的解决方式,右键 ...

  2. 设计模式之美:Product Trader(操盘手)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Product Trader 的示例实现. 意图 使客户程序可以通过命名抽象超类和给定规约来创建对象. Product Trad ...

  3. 设计模式之美:Null Object(空对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...

  4. 设计模式之美:Role Object(角色对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现. 意图 通过明确地附加角色对象到目标对象中,以使对象可以适配不同的客户需求.每个角色对象都代 ...

  5. 设计模式之美:Manager(管理器)

    索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的变化独立于类本身,并且管理 ...

  6. 设计模式之美:Type Object(类型对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...

  7. 设计模式之美:Extension Object(扩展对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...

  8. 设计模式之美:Private Class Data(私有类数据)

    索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):实现对初始化数据的封装. 意图 封装类的初始化数据,控制对类的属性的更改,并保持类数据与使用数据的方法间的隔离. Encapsulate ...

  9. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

随机推荐

  1. C#中指针的用法

    (*) unsafe 和 fixed unsafe { ]; ; i < array.Length; i++) { array[i] = i; } fixed (int* p = array) ...

  2. javascript学习第五课this、call、apply

    js函数与其它 高级语言相比有一个特点.没有返回值,一个简单函数就是function关键字+函数名字构成 this 对象是在运行中基于函数的执行环境绑定的,在全局函数中,this等于window,而当 ...

  3. sublime text3 less2css rem

    1.下载sublime text3 官网地址:https://www.baidu.com/link?url=2kr0ijQXVL1_6oXdPByYh7ecMl7OUAYVx5fyTNjMrYVdtq ...

  4. C#实现:给定任意要给字符串,输出所有可能的回文的子字符串集合。

    class Program { static void Main(string[] args) { string testStr = "sdfadfdsfadfdsfsdf"; i ...

  5. 清空stringbuilder

    大家知道对于字符串频繁拼接是使用stringbuilder.Append方法比使用string+=方法效率高很多,但有时需要清空stringbuilder时却不知道怎么清空,因为它没有clear或em ...

  6. ssh整合,导入structs包后报错 getAnnotation(AnnotatedElement ae,Class<T> annotatetype)找不到

    今天在整合ssh(spring-framework-3.2.5.RELEASE-dist+struts-2.3.15.3-all+hibernate-release-4.2.6.Final)环境的时候 ...

  7. MySQL数据库sql语句的一些简单优化

    1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...

  8. 【Java学习笔记】静态导入

    package p2; //import static java.util.Collections.max; import java.util.ArrayList; import static jav ...

  9. 开发前准备 va2015安装

    1.下载vs2015 2.进行安装(同时安装node.js.npm与Android SDK,会省很多时间) 安装的时候要选择自定义安装 如果先安装了Android SDK的话就不要勾选了,我就是勾选了 ...

  10. 数据类型安全验证都交给TryParse吧

    C# 网站开发中 往往在编写后台代码中遇到从字符类型转换到其他类型.其实无需在单独验证字符串长度,是否为空等工作.直接用Tryparse转换,如果转换失败说明字符串的格式等有误.成功则再进一步验证转换 ...