代理模式
需求:
小明讓小李替他追小麗(送洋娃娃,送花,送巧克力)
沒有代理的代碼:
# -*- 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
只是把追求者類換成了代理類。
實(shí)際的代理模式代碼:
# -*- 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
裝飾模式
需求:
給人搭配不同的服飾
代碼版本一
# -*- 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 '領(lǐng)帶'
end
def wear_leather_shoes
puts '皮鞋'
end
def show
puts "*****裝扮的#{name}\n\n"
end
end
xc=Person.new('小菜')
puts "******第一種裝扮"
xc.wear_t_shirts
xc.wear_big_trouser
xc.wear_sneakers
xc.show
puts "******第二種裝扮"
xc.wear_suit
xc.wear_tie
xc.wear_leather_shoes
xc.show
這樣寫的話,功能是實(shí)現(xiàn)了,問題是如果增加“超人”的裝扮,就要修改Person類,違反了開放-封閉原則。
代碼版本二
# -*- encoding: utf-8 -*-
class Person
attr_accessor :name
def initialize(name)
@name = name
enddef show
puts "*****裝扮的#{name}\n\n"
end
end
class Finery
def show
end
end
class TShirts Finery
def show
puts '大T恤'
end
end
class BigTrouser Finery
def show
puts '垮褲'
end
end
class Sneakers Finery
def show
puts '破球鞋'
end
end
class Suit Finery
def show
puts '西裝'
end
end
class Tie Finery
def show
puts '領(lǐng)帶'
end
end
class LeatherShoes Finery
def show
puts '皮鞋'
end
end
xc=Person.new('小菜')
ts = TShirts.new
bt = BigTrouser.new
sk = Sneakers.new
puts "******第一種裝扮"
ts.show
bt.show
sk.show
xc.show
suit = Suit.new
tie = Tie.new
ls = LeatherShoes.new
puts "******第二種裝扮"
suit.show
tie.show
ls.show
xc.show
這樣改了之后,如果增加超人裝扮,確實(shí)不需要去修改Person類。存在的問題是,各種衣服是獨(dú)立的,并且暴露在外邊的,就是一件一件穿的,沒有順序,沒有控制。
代碼版本三
# -*- encoding: utf-8 -*-
class Person
attr_accessor :name
def initialize(name=nil)
@name = name
end
def show
puts "*****裝扮的#{name}\n\n"
end
end
class Finery Person
attr_accessor :componet
def decorate(componet)
@componet = componet
end
def show
componet.show if componet
end
end
class TShirts Finery
def show
super
puts '大T恤'
end
end
class BigTrouser Finery
def show
super
puts '垮褲'
end
end
class Sneakers Finery
def show
super
puts '破球鞋'
end
end
class Suit Finery
def show
super
puts '西裝'
end
end
class Tie Finery
def show
super
puts '領(lǐng)帶'
end
end
class LeatherShoes Finery
def show
super
puts '皮鞋'
end
end
xc=Person.new('小菜')
ts = TShirts.new
bt = BigTrouser.new
sk = Sneakers.new
puts "******第一種裝扮"
ts.decorate xc
bt.decorate ts
sk.decorate bt
sk.show
suit = Suit.new
tie = Tie.new
ls = LeatherShoes.new
puts "******第二種裝扮"
suit.decorate xc
tie.decorate suit
ls.decorate bt
ls.show
您可能感興趣的文章:- java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼
- java 裝飾模式(Decorator Pattern)詳解
- C# 設(shè)計(jì)模式系列教程-裝飾模式
- 詳解java裝飾模式(Decorator Pattern)
- Java設(shè)計(jì)模式之裝飾模式(Decorator模式)介紹
- C++設(shè)計(jì)模式之裝飾模式
- java設(shè)計(jì)模式之裝飾模式詳細(xì)介紹
- php設(shè)計(jì)模式 Decorator(裝飾模式)
- .NET簡單工廠模式講解
- .NET裝飾模式講解