《大话设计模式》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

 

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

应用场景:

  • 远程代理

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

  • 虚拟代理

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

  • 安全代理

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

  • 智能代理

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

你可能感兴趣的:(设计模式)