激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例

Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例

2020-05-07 11:08范孝鵬 Ruby

這篇文章主要介紹了Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例,代理模式與裝飾模式都可以歸類為結(jié)構(gòu)型的設(shè)計(jì)模式,需要的朋友可以參考下

代理模式

需求:

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

沒有代理的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- 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

只有代理的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- 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í)際的代理模式代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# -*- 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


裝飾模式
 
需求:

給人搭配不同的服飾

代碼版本一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- 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類,違反了開放-封閉原則。

 

代碼版本二

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# -*- 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ú)立的,并且暴露在外邊的,就是一件一件穿的,沒有順序,沒有控制。

代碼版本三

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# -*- 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

延伸 · 閱讀

精彩推薦
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • RubyRuby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象

    Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象

    這篇文章主要介紹了Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們在最高層而不是在一個(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
主站蜘蛛池模板: 男女生羞羞视频网站在线观看 | 国产在线精品区 | 久久久精品视频在线观看 | 国产日产精品久久久久快鸭 | 国产亚洲欧美日韩高清 | 精品一区二区免费视频视频 | 模特三级在线观看 | 一级做a爱片性色毛片高清 国产精品色在线网站 | 免费看欧美一级特黄a大片 久久免费视频一区二区三区 | japanese massage tube | 国产一级大片 | 久久国产精品99久久人人澡 | 韩国一级免费视频 | 日本一区二区久久 | 国产免费黄色 | 久久久久久久久久久av | 国产一级片91 | 久久亚洲美女视频 | 石原莉奈日韩一区二区三区 | 成人午夜在线观看视频 | 亚洲日本韩国精品 | 午夜噜噜噜 | 日本中文字幕电影在线观看 | 成年人激情在线 | japanesexxxxxxxhd| 性日本xxx | 欧美日韩电影在线 | 日本一区二区三区四区高清视频 | 欧美精品一区自拍a毛片在线视频 | 国产高潮国产高潮久久久91 | 九九热九九热 | 成人一区二区三区四区 | 国产免费观看一区二区三区 | :国产精品成人一区二区三区 | 国产一级免费在线视频 | 性猛交ⅹxxx乱巴西 asian超清日本肉体pics | 逼特逼视频在线观看 | 日韩黄色三级视频 | 激情网站在线观看 | 成人免费毛片一 | 久草手机视频在线观看 |