zoukankan      html  css  js  c++  java
  • 利用RealProxy,强化AOP,在”牛粪“的周围插上”鲜花“


    有个接口

        interface I牛粪
        {
            
    void 吃();
        }

    有个接口的实现

        class 牛粪 : I牛粪
        {
            
    public void 吃()
            {
                Console.WriteLine(
    "吃 牛粪 拉!");
            }
        }

    我现在需要在这个吃的动作周围加上一大堆的鲜花,还有围观的群众。如果使用传统的编程方法,得到:

    代码
            public void Test001()
            {
                牛粪 sheet 
    = new 牛粪();

                
    for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine(
    "鲜花");
                }

                Console.WriteLine(
    "围观群众");

                sheet.吃();

                Console.WriteLine(
    "围观群众");

                
    for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine(
    "鲜花");
                }
            }

    如果要还有添加”喝 “,“拉”之类的,怎么办?如果不同动作的入口参数也不一样,怎么办?重复的方法不能写很多次。于是使用代理基础。

    代码
        class Mock<T> : RealProxy
        {
            T instance;
            
    public delegate void OnMock(IMockMethod method);
            
    public event OnMock OnMockMethod;
            
    class MockMethod : IMockMethod
            {
                T instance;
                IMethodCallMessage methodCall;
                
    object result;
                
    public MockMethod(T instance, IMethodCallMessage methodCall)
                {
                    
    this.instance = instance;
                    
    this.methodCall = methodCall;
                }
                
    public void Execute()
                {
                    result 
    = methodCall.MethodBase.Invoke(instance, methodCall.InArgs);
                }
                
    public object Result
                {
                    
    get
                    {
                        
    return result;
                    }
                }
            }

            
    public Mock(T instance)
                : 
    base(typeof(T))
            {
                
    this.instance = instance;
            }

            
    public override IMessage Invoke(IMessage msg)
            {
                IMethodCallMessage methodCall 
    = msg as IMethodCallMessage;

                MockMethod mock 
    = new MockMethod(this.instance, methodCall);

                
    this.OnMockMethod(mock);

                
    return new ReturnMessage(mock.Result, null0null, methodCall);
            }
            
    public T Value
            {
                
    get
                {
                    
    return (T)this.GetTransparentProxy();
                }
            }
            
    public bool Result
            {
                
    get
                {
                    
    return false;
                }
            }
        }

        
    interface IMockMethod
        {
            
    void Execute();
        }

    最后调用是:

    代码
            public void test222()
            {
                Mock
    <I牛粪> mock = new Mock<I牛粪>(new 牛粪());
                mock.OnMockMethod 
    += new Mock<I牛粪>.OnMock(mock_OnMockMethod);
                mock.Value.吃();
            }

            
    void mock_OnMockMethod(IMockMethod method)
            {
                
    for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine(
    "鲜花");
                }
                Console.WriteLine(
    "围观群众");
                method.Execute();
                Console.WriteLine(
    "围观群众");

                
    for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine(
    "鲜花");
                }
            }

    不知道这个技术算不算新。 

  • 相关阅读:
    【BZOJ4337】[BJOI2015] 树的同构(哈希水题)
    【BZOJ4176】Lucas的数论(杜教筛)
    【BZOJ2627】JZPKIL(数论大杂烩)
    【BZOJ2228】[ZJOI2011] 礼物(巧妙的三部曲)
    【BZOJ2954】[POI2002] 超级马(暴搜)
    【BZOJ4498】魔法的碰撞(动态规划)
    【BZOJ3489】A simple rmq problem(三维数点)
    【BZOJ2626】JZPFAR(KD-Tree)
    【BZOJ4520】[CQOI2016] K远点对(KD-Tree)
    【BZOJ1941】[SDOI2010] Hide and Seek(KD-Tree)
  • 原文地址:https://www.cnblogs.com/zc22/p/1677451.html
Copyright © 2011-2022 走看看