• 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);
            }
     
        }
  • 相关阅读:
    201920201学期 20192410《网络空间安全专业导论》第一周学习总结
    201920201学期 20192410《网络空间安全专业导论》第二周学习总结
    Oracle trunc()函数的用法
    20130528
    让ListBox控件支持拖动
    幸福是什么
    实例解析C++/CLI程序进程之间的通讯
    Boost源码剖析之:容器赋值assign
    VC++ MFC 多线程及线程同步
    MFC下窗口分割和文字输出的实现
  • 原文地址:https://www.cnblogs.com/dragon-L/p/4463471.html
Copyright © 2020-2023  润新知