zoukankan      html  css  js  c++  java
  • IOC AOP 设计模式

    IOC AOP 不是什么技术而是一种设计模式  学习 IOC AOP 其实是在学习一种思想。

    1.IOC 

      IOC其实是 将对象的创建和获取提取到外部。由外部IOC容器提供需要的组件。

         看下面代码:

        public class Girl
        { //外部包办直接传入boy类
            public void kiss3(Boy boy)
            {
                Console.WriteLine("girl kiss boy"); 
                boy.kiss();
            }
       
        } public class Boy
        {
            public void kiss()
            {
                Console.WriteLine("boy kiss girl");
            }
        }

    当我在Girl类中要使用Boy类的时候一般做法是在 Girl中实例化Boy类在进行调用如下代码:

        public class Girl
        {
            //1. 内部实例化boy类
            public void kiss1()
            { 
                Boy boy = new Boy();
                boy.kiss();
            }
        }

    然而在IOC 设计模式中 则将实例化操作放到了 IOC容器中,在这里我们将 main 函数作为它的容器。

            static void Main(string[] args)
            {
                Boy boy = new Boy();
                Girl girl = new Girl();
                girl.kiss3(boy); 
            }

    2.AOP

      AOP其实是一种-Proxy模式 (代理模式) 关注主要的东西,也可以说让你只关注业务,其他的东西就让AOP帮你完成。

      看下代码 我定义了一个计算的接口

        /// <summary>
        /// 抽象主题角色(Subject)
        /// </summary>
        public interface IMath
        {
            // 方法
            double Add(double x, double y);
            double Sub(double x, double y);
            double Mul(double x, double y);
            double Div(double x, double y);
    
        }
        /// <summary>
        /// 真实主题角色(RealSubject)角色
        /// </summary>
        public class Math : MarshalByRefObject, IMath
        {
            // 方法
            public double Add(double x, double y) { return x + y; }
            public double Sub(double x, double y) { return x - y; }
            public double Mul(double x, double y) { return x * y; }
            public double Div(double x, double y) { return x / y; }
    
        }

    我通过代理来实现,但是这时候我 Math 类只会做 加法Add 方法,那把其余的交给其人做。 

        /// <summary>
        ///  远程代理对象 Remote "Proxy Object" 
        ///  代理主题(Proxy)角色
        /// </summary>
        public class MathProxy
        {
            IMath math;
    
            // 构造函数
            public MathProxy()
            { 
                if (math == null)
                    math = new Math(); 
            }
    
            // 方法
            public double Add(double x, double y)
            {
                return math.Add(x, y);
            }
            public double Sub(double x, double y)
            {
                return 0;
            }
            public double Mul(double x, double y)
            {
                return 0;
            }
            public double Div(double x, double y)
            {
                return 0;
            }
     
        }
            static void Main(string[] args)
            {
                // 创建代理和请求一个服务
                Proxy p = new Proxy();
                p.Request();
    
                //创建函数
                MathProxy mp = new MathProxy();
    
                // 执行函数
                Console.WriteLine("4 + 2 = {0}", mp.Add(4, 2));
                Console.WriteLine("4 - 2 = {0}", mp.Sub(4, 2));
                Console.WriteLine("4 * 2 = {0}", mp.Mul(4, 2));
                Console.WriteLine("4 / 2 = {0}", mp.Div(4, 2)); 
                Console.ReadLine();
            }

    这个过程就叫AOP。 我只关注一个加法运算 其余的交给其他人做。

    3.IOC AOP 联合使用

    只要改下代理就好。 通过外部的IOC容器来注入依赖对象

        /// <summary>
        ///  远程代理对象 Remote "Proxy Object" 
        ///  代理主题(Proxy)角色
        /// </summary>
        public class MathProxy
        {
            IMath math;
    
            // 构造函数
            public MathProxy(IMath _math)
            {  
                    math = _math;
            }
    
            // 方法
            public double Add(double x, double y)
            {
                return math.Add(x, y);
            }
            public double Sub(double x, double y)
            {
                return math.Sub(x, y);
            }
            public double Mul(double x, double y)
            {
                return math.Mul(x, y);
            }
            public double Div(double x, double y)
            {
                return math.Div(x, y);
            }
     
        }
  • 相关阅读:
    icomet研究
    python使用ssdb的队列,用于替换canal+rabbitmq
    最近关于mysql的造型,binlog使用,以及阿里云上线数据处理错误导致被处罚的思考
    删除一个存在的RabbitMQ队列
    检查Rabbitmq中队列及消息个数,还有清空的方法
    Mysql在master上查看有哪些slave
    查看Linux端口的占用及连接情况
    Kettle根据时间戳同步数据实现
    kettle的下载、安装和初步使用(windows平台下)(图文详解)
    golang学习 ----获取URL
  • 原文地址:https://www.cnblogs.com/dragon-L/p/4463471.html
Copyright © 2011-2022 走看看