Ruby使用设计模式中的代理模式与装饰模式的代码实例
技术  /  管理员 发布于 6年前   251
代理模式
需求:
小明让小李替他追小丽(送洋娃娃,送花,送巧克力)
没有代理的代码:
# -*- 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} 送你巧克力" endend#被追求者类class Girl attr_accessor :name def initialize(name) @name = name endendxiao_hong = Girl.new('小红')xiao_ming = Pursuit.new(xiao_hong)xiao_ming.give_dollsxiao_ming.give_flowersxiao_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} 送你巧克力" endend#被追求者类class Girl attr_accessor :name def initialize(name) @name = name endendxiao_hong = Girl.new('小红')xiao_ming = Proxy.new(xiao_hong)xiao_ming.give_dollsxiao_ming.give_flowersxiao_ming.give_chocolate
只是把追求者类换成了代理类。
实际的代理模式代码:
# -*- encoding: utf-8 -*-#公共接口modulemodule GiveGift def give_dolls end def give_flowers end def give_chocolate endend#追求者类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}送你巧克力" endend#代理类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 endend#被追求者类class Girl attr_accessor :name def initialize(name) @name = name endendxiao_hong = Girl.new('小红')xiao_ming = Proxy.new(xiao_hong)xiao_ming.gg.name = '小明'xiao_ming.give_dollsxiao_ming.give_flowersxiao_ming.give_chocolate
装饰模式
需求:
给人搭配不同的服饰
代码版本一
# -*- encoding: utf-8 -*-class Person attr_accessor :name def initialize(name) @name = name end def wear_t_shirts puts '大T恤' end def wear_big_trouser puts '垮裤' end def wear_sneakers puts '破球鞋' end def wear_suit puts '西装' end def wear_tie puts '领带' end def wear_leather_shoes puts '皮鞋' end def show puts "*****装扮的#{name}\n\n" endendxc=Person.new('小菜')puts "******第一种装扮"xc.wear_t_shirtsxc.wear_big_trouserxc.wear_sneakersxc.showputs "******第二种装扮"xc.wear_suitxc.wear_tiexc.wear_leather_shoesxc.show
这样写的话,功能是实现了,问题是如果增加“超人”的装扮,就要修改Person类,违反了开放-封闭原则。
代码版本二
# -*- encoding: utf-8 -*-class Person attr_accessor :name def initialize(name) @name = name enddef show puts "*****装扮的#{name}\n\n" endendclass Finery def show endendclass TShirts < Finery def show puts '大T恤' endendclass BigTrouser < Finery def show puts '垮裤' endendclass Sneakers < Finery def show puts '破球鞋' endendclass Suit < Finery def show puts '西装' endendclass Tie < Finery def show puts '领带' endendclass LeatherShoes < Finery def show puts '皮鞋' endendxc=Person.new('小菜')ts = TShirts.newbt = BigTrouser.newsk = Sneakers.newputs "******第一种装扮"ts.showbt.showsk.showxc.showsuit = Suit.newtie = Tie.newls = LeatherShoes.newputs "******第二种装扮"suit.showtie.showls.showxc.show
这样改了之后,如果增加超人装扮,确实不需要去修改Person类。存在的问题是,各种衣服是独立的,并且暴露在外边的,就是一件一件穿的,没有顺序,没有控制。
代码版本三
# -*- encoding: utf-8 -*-class Person attr_accessor :name def initialize(name=nil) @name = name end def show puts "*****装扮的#{name}\n\n" endendclass Finery < Person attr_accessor :componet def decorate(componet) @componet = componet end def show componet.show if componet endendclass TShirts < Finery def show super puts '大T恤' endendclass BigTrouser < Finery def show super puts '垮裤' endendclass Sneakers < Finery def show super puts '破球鞋' endendclass Suit < Finery def show super puts '西装' endendclass Tie < Finery def show super puts '领带' endendclass LeatherShoes < Finery def show super puts '皮鞋' endendxc=Person.new('小菜')ts = TShirts.newbt = BigTrouser.newsk = Sneakers.newputs "******第一种装扮"ts.decorate xcbt.decorate tssk.decorate btsk.showsuit = Suit.newtie = Tie.newls = LeatherShoes.newputs "******第二种装扮"suit.decorate xctie.decorate suitls.decorate btls.show
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号