设计模式之美: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 ...
随机推荐
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...
- Spring 4 官方文档学习 Spring与Java EE技术的集成
本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...
- V8Sharp的中文乱码问题解决
V8是一个开源的javascript引擎,到现在为止堪称为是性能最好最稳定的javascript.因此还诞生了一个基于此引擎的服务端开发框架:Node.js.由此可见此引擎的牛逼之处.由于打算在后续项 ...
- .net/C# HttpWebRequest传送与接收参数
public string PostData(string url, string data)//url:要发送到网站的地址 data:传送需要的参数 { HttpWebRequest myReque ...
- [C#基础实例]指定地址解析图片并下载
需求:查找页面图片并下载至本地: 实现: 首先:读取通过网络html内容,并用正则表达式查找图片地下. 其次:使用WebRequest.Create创建图片请求. 最后:把获取图片网络流数据通过Fil ...
- java swing 去掉按钮文字周围的焦点框
闲来无事,写了个swing界面,运行后看到当点击按钮时,中间文字会出现一个刚好把文字围住的小方框,这是按钮获得焦点的标志,我是觉得一个字:丑!怎么去掉呢?万能的度娘告诉我,设置下button的setF ...
- oracle DBMS_LOCK.SLEEP()的使用
create or replace procedure times isii positive:=1;beginloop dbms_lock.sleep(1);dbms_output.put_line ...
- [UCSD白板题] Fractional Knapsack
Problem Introduction Given a set of items and total capacity of a knapsack,find the maximal value of ...
- Codeforces #380 div2 B(729B) Spotlights
B. Spotlights time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 关于ubuntu16.4 中安装最新的eclipse或者是STS出现页面特卡,且新建项目没有提示,preference选项中点击左侧标签右侧没反应的解决办法,参照google, 排版不太好,希望对一些小伙伴有所帮助
up vote21down votefavorite 12 Eclipse was working as good as anything on 14.04. I did a clean instal ...