设计模式之美: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 的示例实现。
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(动态属性)的更多相关文章
- Dynamic Property Wizard 添加类提示 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目 错误提示解决方式
在重新打开OPM项目添加ATL动态属性向导Dynamic Property Wizard提示错误 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目. 有效的解决方式,右键 ...
- 设计模式之美:Product Trader(操盘手)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Product Trader 的示例实现. 意图 使客户程序可以通过命名抽象超类和给定规约来创建对象. Product Trad ...
- 设计模式之美:Null Object(空对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...
- 设计模式之美:Role Object(角色对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现. 意图 通过明确地附加角色对象到目标对象中,以使对象可以适配不同的客户需求.每个角色对象都代 ...
- 设计模式之美:Manager(管理器)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的变化独立于类本身,并且管理 ...
- 设计模式之美:Type Object(类型对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...
- 设计模式之美:Extension Object(扩展对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...
- 设计模式之美:Private Class Data(私有类数据)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):实现对初始化数据的封装. 意图 封装类的初始化数据,控制对类的属性的更改,并保持类数据与使用数据的方法间的隔离. Encapsulate ...
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
随机推荐
- ue4 NewObject/StaticConstructObject_Internal/StaticAllocateObject/FObjectInitializer:对象创建和初始化
UObject是一套很复杂的体系,之前读ue3代码时曾分析过其类型系统实现,主要是与UClass间的关系 现在转到ue4,发现那一块其实差不多,于是再重点备忘一下UObject本身的创建和初始化过程 ...
- flex柱状图
柱状图的展现是通过flex自带的控件实现 控件解析:<mx:ColumnChart id = "columns" dataProvider = "{dataSour ...
- bzoj1179(Atm)
---恢复内容开始--- 1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MB Description Input 第一行包含两个整 ...
- [转]为什么使用 Redis及其产品定位
原文链接:http://www.infoq.com/cn/articles/tq-why-choose-redis 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据 ...
- ubuntu 14 中tomcat的开机启动设置
开机自启动,将要执行的语句写入/etc/rc.local. #!/bin/sh -e # # rc.local # # This script is executed at the end of ea ...
- Android应用:StatusBar状态栏、NavigationBar虚拟按键栏、ActionBar标题栏、Window屏幕内容区域等的宽高
一.屏幕中各种栏目以及屏幕的尺寸 当我们需要计算屏幕中一些元素的高度时,或许需要先获取到屏幕或者各种栏目的高度,下面这个类包含了Status bar状态栏,Navigation bar虚拟按键栏,Ac ...
- 简单的比大小 shell 脚本和ping
#!/bin/bash echo "输入第一个数字"read Aecho "输入第二个数字"read B if [ $A -gt $B ] thenecho & ...
- Ubuntu12.04下编译OpenCv2.4.9程序
引用地址http://blog.163.com/huai_jing@126/blog/static/171861983201311103411229/ 方法1:直接命令编译: g++ main.cpp ...
- MyEclipse下XFire开发Webservice实例
XFire Java SOAP框架概述 (摘自:http://tech.it168.com/j/e/2006-10-28/200610281432707.shtml ) MyEclipse W ...
- MyEclipse10优化
Myeclipse10 优化设置 一.myeclipse字体设置 Window->Preferences->General->Appearance->Colors and Fo ...