zoukankan      html  css  js  c++  java
  • 通过代理为对象添加功能

    using System;
    using System.Threading;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting;

    namespace ConsoleApplication1
    {
        public interface ICalculator
        {
            double Add(double x, double y);
            double Multiply(double x, double y);
        }


        public class PriortyProxy:RealProxy//定义增加优先级的代理类
        {
            readonly MarshalByRefObject target;
            readonly ThreadPriority level;
            public PriortyProxy(MarshalByRefObject target, Type type, ThreadPriority level):base(type)
            {
                this.target = target;
                this.level = level;
            }
            public override IMessage Invoke(IMessage request)
            {
                IMethodCallMessage call=(IMethodCallMessage)request;
               //调整优先级
                Thread here = Thread.CurrentThread;
                ThreadPriority old = here.Priority;
                here.Priority = level;
             //转发调用
                IMessage response = RemotingServices.ExecuteMessage(target, call);
             //回复为旧的优先级
                here.Priority = old;
             // 将响应消息返回给透明代理
                return response;
            }
        }

        public class MyCalc : MarshalByRefObject, ICalculator
        {
            public static MyCalc Create(ThreadPriority level)//创建插入代理的工厂方法
            {
                MyCalc target = new MyCalc();
                PriortyProxy rp = new PriortyProxy(target, typeof(MyCalc), level);
                return (MyCalc)rp.GetTransparentProxy();
            }
            private MyCalc() { }
            public double Add(double x, double y) { return x + y; }
            public double Multiply(double x, double y) { return x * y; }
        }
        class Program
        {
            static void Main(string[] args)
            {
                MyCalc c = MyCalc.Create(ThreadPriority.Highest);
                Console.WriteLine(c.Add(1.0, 3.34));
                Console.WriteLine(c.Multiply(2.0, 3.14));
                Console.ReadLine();
            }
        }
    }
    上述例子为MyCalc类的方法调用实现线程优先级的调整。将优先级调整代码从MyCalc类中分离了出来,但是这并不是透明的。MyCalc必须些一个工厂方法!也必须使用该方法。不能直接用new来创建MyCalc!
    上面的例子来自<<.net本质论>>第七章! 

  • 相关阅读:
    i++后的哈希码会变的原因
    Synchronized 锁的错误使用方式及如何解决
    线程的状态及状态之间的转换
    水满自溢「限流算法第四把法器:漏桶算法」- 第303篇
    Thread的Interrupt、isInterrupted、interrupted
    证明java本身是一个多线程
    强引用、软引用、弱引用、虚引用
    经典脏读,幻想读 不可重复读
    没有预热,不叫高并发「限流算法第三把法器:令牌桶算法」- 第302篇
    redisAPI
  • 原文地址:https://www.cnblogs.com/xhan/p/871090.html
Copyright © 2011-2022 走看看