XDecorator简介

    XDecorator是一个开源的面向接口的动态装饰系统。装饰的类型和被装饰的类型必须是一个公开的接口,具体部分需要一个具体的混入类来控制。

    看一下基本使用:

    1、一个被装饰的接口(INamedObject)

     public   interface  INamedObject
    
{
        
string Name getset; }
    }

    2、一个装饰后的接口(INamedObjectEx)

     public   interface  INamedObjectEx
        : INamedObject
    
{
        
event EventHandler NameChanged;
    }

    3、一个混入类(NotifyMixin)

    [DecoratorMixinType( typeof (INamedObject),  typeof (INamedObjectEx))]
    
public   class  NotifyMixin
    
{

        
private INamedObject _src;
        
private INamedObjectEx _decorator;

        
public NotifyMixin(INamedObject src, INamedObjectEx decorator)
        
{
            _src 
= src;
            _decorator 
= decorator;
        }


        [DecoratorMixinProperty()]
        
public string Name
        
{
            
get return _src.Name; }
            
set
            
{
                
if (value != _src.Name)
                
{
                    _src.Name 
= value;
                    OnNameChanged(EventArgs.Empty);
                }

            }

        }


        
protected virtual void OnNameChanged(EventArgs e)
        
{
            
if (NameChanged != null)
                NameChanged(_decorator, e);
        }


        [DecoratorMixinEvent()]
        
public event EventHandler NameChanged;
    }

    所有的必须部分已经完成,为了让程序能够跑起来,额外需要一个INamedObject的具体实现类(如果对动态接口概念熟悉的话,也可以用动态接口来获得实例)

     public   sealed   class  SomeNamedObject
        : INamedObject
    
{

        
Fields

        
Ctors

        
INamedObject Members

    }

    现在就可以写主程序了,代码如下:

     class  Program
    
{
        
static void Main(string[] args)
        
{
            INamedObject obj 
= new SomeNamedObject();
            INamedObjectEx decorator 
= DecoratorFactory.Create<INamedObject, INamedObjectEx, NotifyMixin>(obj);
            Console.WriteLine(
"obj's name is: {0}", obj.Name);
            decorator.NameChanged 
+= new EventHandler(decorator_NameChanged);
            decorator.Name 
= "new name";
            Console.WriteLine(
"obj's name is: {0}", obj.Name);
            Console.ReadLine();
        }


        
static void decorator_NameChanged(object sender, EventArgs e)
        
{
            INamedObjectEx decorator 
= sender as  INamedObjectEx;
            Console.WriteLine(
"name changed to: {0}", decorator.Name);
        }

    }

    这里将一个INamedObject的实例包装成一个INamedObjectEx的实例,访问其中改写过的Name属性和新增加的NameChanged事件。

    XDecorator下载请到本人的下载资源中下载(包含程序集和源代码)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值