zoukankan      html  css  js  c++  java
  • 《大话设计模式》ruby版代码:代理模式

    需求:

    小明让小李替他追小丽(送洋娃娃,送花,送巧克力)

    没有代理的代码:

    # -*- encoding: utf-8 -*-
    
    #追求者类
    class Pursuit
        attr_accessor :mm
        
        def initialize(mm)
            @mm = mm
        end
        
        def give_dolls
            puts "#{mm.name} 送你洋娃娃"
        end
        
        def give_flowers
            puts "#{mm.name} 送你鲜花"
        end
        
        def give_chocolate
            puts "#{mm.name} 送你巧克力"
        end
    
    end
    
    #被追求者类
    class Girl
        attr_accessor :name
        
        def initialize(name)
            @name = name
        end
    end
    
    xiao_hong = Girl.new('小红')
    
    xiao_ming = Pursuit.new(xiao_hong)
    xiao_ming.give_dolls
    xiao_ming.give_flowers
    xiao_ming.give_chocolate

    只有代理的代码:

    # -*- encoding: utf-8 -*-
    
    #代理类
    class Proxy
        attr_accessor :mm
        
        def initialize(mm)
            @mm = mm
        end
        
        def give_dolls
            puts "#{mm.name} 送你洋娃娃"
        end
        
        def give_flowers
            puts "#{mm.name} 送你鲜花"
        end
        
        def give_chocolate
            puts "#{mm.name} 送你巧克力"
        end
    
    end
    
    #被追求者类
    class Girl
        attr_accessor :name
        
        def initialize(name)
            @name = name
        end
    end
    
    xiao_hong = Girl.new('小红')
    
    xiao_ming = Proxy.new(xiao_hong)
    xiao_ming.give_dolls
    xiao_ming.give_flowers
    xiao_ming.give_chocolate

    只是把追求者类换成了代理类。

    实际的代理模式代码:

    # -*- encoding: utf-8 -*-
    
    #公共接口module
    module GiveGift
        def give_dolls
        end
        
        def give_flowers
        end
        
        def give_chocolate
        end
    end
    
    #追求者类
    class Pursuit
        include GiveGift
        attr_accessor :mm, :name
        
        def initialize(mm)
            @mm = mm
        end
        
        def give_dolls
            puts "#{mm.name} 替#{name}送你洋娃娃"
        end
        
        def give_flowers
            puts "#{mm.name} 替#{name}送你鲜花"
        end
        
        def give_chocolate
            puts "#{mm.name} 替#{name}送你巧克力"
        end
    
    end
    
    #代理类
    class Proxy
        include GiveGift
        attr_accessor :gg
        
        def initialize(mm)
            @gg = Pursuit.new(mm)
        end
        
        def give_dolls
            gg.give_dolls
        end
        
        def give_flowers
            gg.give_flowers
        end
        
        def give_chocolate
            gg.give_chocolate
        end
    
    end
    
    #被追求者类
    class Girl
        attr_accessor :name
        
        def initialize(name)
            @name = name
        end
    end
    
    xiao_hong = Girl.new('小红')
    
    xiao_ming = Proxy.new(xiao_hong)
    xiao_ming.gg.name = '小明'
    xiao_ming.give_dolls
    xiao_ming.give_flowers
    xiao_ming.give_chocolate

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。

    应用场景:

    • 远程代理

    为一个对象在不同的地址提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。

    • 虚拟代理

    是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

    • 安全代理

    用来控制真是对象访问时的权限。

    • 智能代理

    当调用真实对象时,代理处理另外一些事。

  • 相关阅读:
    MSSQL的基础应用
    SQLLite的使用
    C#反射调用其它DLL的委托事件 传值
    SQLServer 取 字段名称 类型 字段描述 等
    WCF跨域 客户端无法访问
    不同的数据库数据类型映射
    用人四策
    思考集体跳槽
    C/C++/Qt 统计运行时间
    CUDA项目属性设置
  • 原文地址:https://www.cnblogs.com/fanxiaopeng/p/4198689.html
Copyright © 2011-2022 走看看