设计模式之行为型模式三Word下载.docx
《设计模式之行为型模式三Word下载.docx》由会员分享,可在线阅读,更多相关《设计模式之行为型模式三Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
课本实例:
商场打折
代码如下:
[csharp]
viewplaincopyprint?
1.class
cashcontext
2.
{
3.
//基类类型的对像
4.
private
CashSuper
cs;
5.
//初始化时(构造函数),传入具体的对象
6.
public
cashcontext(CashSuper
csuper)
7.
8.
this.cs
=
csuper;
9.
//将csuper赋给cs,然后计算cs对象的收到的现金数
10.
//通过传入参数的不同,计算不同方式的收到现金数
11.
}
12.
double
getresult(double
money)
13.
//根据具体的策略对象,调用其算法的方法
14.
15.
return
cs.acceptCash(money);
16.
17.
18.
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.
Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态
游戏的状态保存
1.//一个发起人类:
有攻击力,生命力,还有创建备忘和恢复备忘的功能等
class
GameRole
//生命力
int
vit;
Vitality
get
set
vit
value;
//攻击力
atk;
Attack
atk
;
//防御类
19.
def;
20.
Defense
21.
22.
def
23.
24.
25.
//状态显示
26.
void
StateDisplay()
27.
28.
Console.WriteLine("
角色当前状态:
"
);
29.
体力:
{0}"
this.vit);
30.
攻击力:
this.atk);
31.
防御类:
this.def);
32.
33.
34.
//获得初始状态
35.
GetInitState()
36.
37.
this.vit
100;
38.
this.atk
39.
this.def
40.
41.
//战斗
42.
Fight()
43.
44.
0;
45.
46.
47.
48.
//保存角色状态
49.
RoleStateMemento
SaveState()
50.
51.
//保存状态时,创建存储箱
52.
(new
RoleStateMemento(vit,
atk,
def));
53.
54.
//恢复角色状态
55.
RecoveryState(RoleStateMemento
memento)
56.
57.
memento.Vitality
58.
memento
.Attack
59.
memento.Defense
60.
61.
62.
//一个备忘录类:
将要备忘的内容存储在备忘录中
63.
//角色状态存储箱
64.
65.
66.
67.
68.
69.
//以上是角色状态存储箱的一些属性
70.
RoleStateMemento(int
vit,
def)
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
{atk
88.
89.
//防御力
90.
91.
92.
93.
{def
94.
95.
//以上是存储箱的一些函数,是指可以对生命力等状态进行读写
96.
97.
98.
//一个管理者类:
将备忘录类进行封装,以便在客户端只需要知道管理者这个类,将备忘的
99.
//角色状态管理者
100.
RoleStateCaretaker
101.
102.
memento;
103.
Memento
104.
105.
106.
107.
108.
109.
110.
//客户端:
111.
//大战前
112.
hejingyuan
new
GameRole();
113.
hejingyuan.GetInitState();
114.
hejingyuan.StateDisplay();
115.
116.
//保存进度
117.
stateAdmin
RoleStateCaretaker();
118.
stateAdmin.Memento
hejingyuan.SaveState();
119.
//大战时,损耗严重
120.
hejingyuan.Fight();
121.
122.
//恢复之前状态
123.
hejingyuan.RecoveryState(stateAdmin.Memento);
124.
125.
Console.Read();
126.
备忘录模式:
当我要保存备忘时,再发起人(游戏角色)这个类中就创建备忘录,备忘录这个类中具有要备忘的一些内容(属性和方法)等,管理者是对备忘录进行包装,在客户端将发起人备忘赋给管理者这个对象,这样客户端的人就不需要知道我备忘的是什么内容了。
迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式
应用:
当你需要对聚集有多种方法遍历时,可以考虑用迭代器模式
总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据.
乘车买票
1.//Iterator迭代器抽象类
abstract
Iterator
object
First();
Next();
IsDone();
CurrentItem();
//迭代器就是对一个聚集对象遍历
//ConcreteIterator具体迭代器类,继承Iterator
ConcreteIterator
:
//创建了一个具体聚集对象
ConcreteAggregate
aggregate;
current
ConcreteIterator(ConcreteAggregate
aggregate)
this.aggregate
//初始化时将具体的聚集对象传入
override
First()
aggregate[0];
Next()
ret
null;
current++;
if
(current
<
aggregate.Count)
aggregate[current];
ret;
IsDone()
>
aggregate.Count
?
true
false;
CurrentItem()
//具体迭代器就是对具体聚集对象的操作,也是对抽象迭代器的重写
//Aggregate
Aggregate
CreateIterator();
//抽象聚集类就是要创建迭代器
//ConcreteAggregate具体聚集类
继承Aggregate
IList<
object>
items
List<
();
CreateIterator()
ConcreteIterator(this);
Count
items.Count;
this[int
index]