时间:2021-05-22
代理模式
需求:
小明让小李替他追小丽(送洋娃娃,送花,送巧克力)
没有代理的代码:
# -*- 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声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下:什么是装饰器模式作为一种结构型模式,装饰器(Decorator)模式就是对一
本文实例讲述了Java设计模式之代理模式与装饰模式。分享给大家供大家参考,具体如下:之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样!从网上也
本文实例讲述了java设计模式之装饰模式原理与用法。分享给大家供大家参考,具体如下:装饰模式能在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它
本文实例讲述了javascript设计模式–装饰模式原理与应用。分享给大家供大家参考,具体如下:介绍:装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外
之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。简单工厂模式:#-*-enco