索引

别名

  • 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. 关于python的requests库抓取源文件中文乱码的情况

    import requests html=requests.get('http://www.12306.cn/mormhweb/') print html.text 刚开始是这么写的,运行时一直弹出错 ...

  2. Linux_arm驱动之按键模拟脉冲实现定时器的精确计时

    /***************************************************************** 内核驱动部分button_ker.c ************** ...

  3. arcgis操作笔记-根据属性提取某区域要素

    1. 提取

  4. UICollectionView swift2模版

    class testViewController:BaseViewController,UICollectionViewDataSource, UICollectionViewDelegate , U ...

  5. [WPF]Slider控件常用方法

    WPF的Slider控件继承自RangeBase类型,同继承自RangeBase的控件还有ProgressBar和ScrollBar,这类控件都是在一定数值范围内表示一个值的用途. 首先注意而Rang ...

  6. 从0到1搭建移动App功能自动化测试平台(2):操作iOS应用的控件

    转自:http://debugtalk.com/post/build-app-automated-test-platform-from-0-to-1-Appium-interrogate-iOS-UI ...

  7. LeetCode(131)Palindrome Partitioning

    题目 Given a string s, partition s such that every substring of the partition is a palindrome. Return ...

  8. js高阶函数

    我是一个对js还不是很精通的选手: 关于高阶函数详细的解释 一个高阶函数需要满足的条件(任选其一即可) 1:函数可以作为参数被传递 2:函数可以作为返回值输出 吧函数作为参数传递,这代表我们可以抽离一 ...

  9. js-正则表达式的替换

    正则表达式替换使用的是replace()方法.Replace()方法是用一些字符途欢另一些字符 语法:stringObject.replace(regexp,replacement) regexp 必 ...

  10. ros学习笔记 - 深度传感器转换成激光数据(hector_slam)

    前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...