读书人

谋略模式之GOF

发布时间: 2012-12-21 12:03:49 作者: rapoo

策略模式之GOF

前言

?

如图所示,在Duck基类里实现了公共的quack()和swim()方法,而MallardDuck和RedheadDuck可以分别覆盖实现自己的display()方法,这样即重用了公共的部分,又支持不同子类的个性化扩展。从目前的情况看,这是一个很好的设计,哈!

??


??? Joe的上司很高兴,带着新产品给董事们演示去了……??



Joe的上司知道后怒了:“你这样做难道是希望所有需要quack()和fly()方法的鸭子都去重复实现这两个方法的功能吗?就这么几个鸭子还好说,但是我们有几十、上百个鸭子的时候你怎么办?如果某个方法要做一点修改,难道你要重复修改上百遍吗?你是不是疯啦?”

Joe已经晕了,“你说了这么多,全是大白话,来点代码行不行,我要C#的!”。说到这里,我们也该开始彻底改造这个设计了,并会在最后附加部分代码来帮助大家理解。

??

我们再看看整个设计修改后的类图:


最后大家再看看演示代码,因为代码比较多,就不贴出来了,大家可以下载后参考:谋略模式之GOF。下面是演示代码的执行结果:

谋略模式之GOF

这就是策略模式

Context(应用场景):


应用场景和优缺点

using?System;
?2谋略模式之GOFusing?System.Collections;
?3谋略模式之GOF
?4谋略模式之GOFpublic?class?SamplesArrayList??{
?5谋略模式之GOF?
?6谋略模式之GOF???public?class?myReverserClass?:?IComparer??{
?7谋略模式之GOF
?8谋略模式之GOF??????//?Calls?CaseInsensitiveComparer.Compare?with?the?parameters?reversed.
?9谋略模式之GOF??????int?IComparer.Compare(?Object?x,?Object?y?)??{
10谋略模式之GOF??????????return(?(new?CaseInsensitiveComparer()).Compare(?y,?x?)?);
11谋略模式之GOF??????}
12谋略模式之GOF
13谋略模式之GOF???}
14谋略模式之GOF
15谋略模式之GOF???public?static?void?Main()??{
16谋略模式之GOF?
17谋略模式之GOF??????//?Creates?and?initializes?a?new?ArrayList.
18谋略模式之GOF??????ArrayList?myAL?=?new?ArrayList();
19谋略模式之GOF??????myAL.Add(?"The"?);
20谋略模式之GOF??????myAL.Add(?"quick"?);
21谋略模式之GOF??????myAL.Add(?"brown"?);
22谋略模式之GOF??????myAL.Add(?"fox"?);
23谋略模式之GOF??????myAL.Add(?"jumps"?);
24谋略模式之GOF??????myAL.Add(?"over"?);
25谋略模式之GOF??????myAL.Add(?"the"?);
26谋略模式之GOF??????myAL.Add(?"lazy"?);
27谋略模式之GOF??????myAL.Add(?"dog"?);
28谋略模式之GOF?
29谋略模式之GOF??????//?Displays?the?values?of?the?ArrayList.
30谋略模式之GOF??????Console.WriteLine(?"The?ArrayList?initially?contains?the?following?values:"?);
31谋略模式之GOF??????PrintIndexAndValues(?myAL?);
32谋略模式之GOF?
33谋略模式之GOF??????//?Sorts?the?values?of?the?ArrayList?using?the?default?comparer.
34谋略模式之GOF??????myAL.Sort();
35谋略模式之GOF??????Console.WriteLine(?"After?sorting?with?the?default?comparer:"?);
36谋略模式之GOF??????PrintIndexAndValues(?myAL?);
37谋略模式之GOF
38谋略模式之GOF??????//?Sorts?the?values?of?the?ArrayList?using?the?reverse?case-insensitive?comparer.
39谋略模式之GOF??????IComparer?myComparer?=?new?myReverserClass();
40谋略模式之GOF??????myAL.Sort(?myComparer?);
41谋略模式之GOF??????Console.WriteLine(?"After?sorting?with?the?reverse?case-insensitive?comparer:"?);
42谋略模式之GOF??????PrintIndexAndValues(?myAL?);
43谋略模式之GOF
44谋略模式之GOF???}
45谋略模式之GOF?
46谋略模式之GOF???public?static?void?PrintIndexAndValues(?IEnumerable?myList?)??{
47谋略模式之GOF??????int?i?=?0;
48谋略模式之GOF??????foreach?(?Object?obj?in?myList?)
49谋略模式之GOF?????????Console.WriteLine(?"\t[{0}]:\t{1}",?i++,?obj?);
50谋略模式之GOF??????Console.WriteLine();
51谋略模式之GOF???}
52谋略模式之GOF
53谋略模式之GOF}
54谋略模式之GOF
55谋略模式之GOF
56谋略模式之GOF/*?
57谋略模式之GOFThis?code?produces?the?following?output.
58谋略模式之GOFThe?ArrayList?initially?contains?the?following?values:
59谋略模式之GOF????????[0]:????The
60谋略模式之GOF????????[1]:????quick
61谋略模式之GOF????????[2]:????brown
62谋略模式之GOF????????[3]:????fox
63谋略模式之GOF????????[4]:????jumps
64谋略模式之GOF????????[5]:????over
65谋略模式之GOF????????[6]:????the
66谋略模式之GOF????????[7]:????lazy
67谋略模式之GOF????????[8]:????dog
68谋略模式之GOF
69谋略模式之GOFAfter?sorting?with?the?default?comparer:
70谋略模式之GOF????????[0]:????brown
71谋略模式之GOF????????[1]:????dog
72谋略模式之GOF????????[2]:????fox
73谋略模式之GOF????????[3]:????jumps
74谋略模式之GOF????????[4]:????lazy
75谋略模式之GOF????????[5]:????over
76谋略模式之GOF????????[6]:????quick
77谋略模式之GOF????????[7]:????the
78谋略模式之GOF????????[8]:????The
79谋略模式之GOF
80谋略模式之GOFAfter?sorting?with?the?reverse?case-insensitive?comparer:
81谋略模式之GOF????????[0]:????the
82谋略模式之GOF????????[1]:????The
83谋略模式之GOF????????[2]:????quick
84谋略模式之GOF????????[3]:????over
85谋略模式之GOF????????[4]:????lazy
86谋略模式之GOF????????[5]:????jumps
87谋略模式之GOF????????[6]:????fox
88谋略模式之GOF????????[7]:????dog
89谋略模式之GOF????????[8]:????brown?
90谋略模式之GOF*/

关于组合和继承,我们只要这样来理解即可:组合是一种“HAS-A”关系,而继承是一种“IS-A”关系。很明显“HAS-A”要比“IS-A”更灵活一些。也就是说在创建系统的时候,我们应该优先使用对象组合,因为它不仅可以给你提供更多灵活性和扩展性,而且还使你可以在运行时改变行为(组合不同的对象),这简直是酷毙了!但是也不是说继承就是不能用,只是说应该把继承应用在相对更稳定,几乎没有变化的地方,例如前面的Duck类里的Swim()方法,因为可以肯定所有鸭子一定都会游泳,所以就没有必要给这个行为提供基于Strategy模式的实现方式,因为那样做除了是程序更复杂以外,没有什么意义。

转载自 : http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html

读书人网 >编程

热点推荐