索引

别名

  • 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. Sql Server 日期查询

    当前月: USE [DBName] Go Use Database, Declare Variables DECLARE @ReportGenerationDate DATE DECLARE @Rep ...

  2. Python list列表的排序

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建函数sort() 这个应该是我们使用最多的也是最简单的排序函 ...

  3. Crystal Reports拉报表报错:Error detected by database DLL

    问题描述: 最近在使用Crystal Reports打印报表时,提示错误信息:"Error detected by database DLL." 如下图: 经查找,是因为数据库名称 ...

  4. Jquery插件开发精品教程

    最开始接触jquery对他提供的各种插件总是十分有兴趣,但是总是不理解为什么这样写,从网络上查询了很久终于找到这篇文章,讲解的很详细,分享给大家. 要说jQuery 最成功的地方,我认为是它的可扩展性 ...

  5. UWP的拖拽功能

    简单的拖拽实现: <Grid x:Name="G1" AllowDrop="True" DragEnter="G1_DragEnter" ...

  6. jackson2.5.0升级到2.7.0

    开发环境:spring-mvc4.1.7.jackson2.7.0 问题描述:项目中将原来的jackson2.5.0升级到2.7.0,导致服务调用出错. mvc相关的配置文件如下: <?xml ...

  7. C# abstract

    Abstract: 1.用途:提供一个可供多个派生类共享的通用基类定义. 2.抽象类也可以定义抽象方法,方法是将关键字 abstract 添加到方法的返回类型的前面(抽象方法没有实现,所以方法定义后面 ...

  8. spring事务源码研读1

    转载摘录自:Spring事务源码分析(一)Spring事务入门 有时为了保证一些操作要么都成功,要么都失败,这就需要事务来保证. 传统的jdbc事务如下: @Test public void test ...

  9. 『TCP/IP详解——卷一:协议』读书笔记——17

    2013-08-27 15:37:42 6.5 ICMP端口不可达差错 端口不可达报文是ICMP差错报文的一种,它是ICMP不可达报文中的一种,以此来看一看ICMP差错报文中所附加的信息.使用UDP来 ...

  10. berkeley db 内存池 LRU算法

    priority based lru in src/mp/mp_fget.c, __memp_fget(), 初始化 一个page buffer时, 设置其 priority: bhp->pri ...