??xml version="1.0" encoding="utf-8" standalone="yes"?>女人高潮久久久叫人喷水,伊人久久大香线蕉综合5g,精品久久人妻av中文字幕http://www.shnenglu.com/wanghaiguang/category/19607.html不要费你的生命Q在你一定会(x)后?zhn)的地方上? 逆水行舟Q不q则退zh-cnTue, 17 Jul 2012 07:56:40 GMTTue, 17 Jul 2012 07:56:40 GMT60设计模式之strategyhttp://www.shnenglu.com/wanghaiguang/archive/2012/07/17/183830.html王v?/dc:creator>王v?/author>Tue, 17 Jul 2012 00:11:00 GMThttp://www.shnenglu.com/wanghaiguang/archive/2012/07/17/183830.htmlhttp://www.shnenglu.com/wanghaiguang/comments/183830.htmlhttp://www.shnenglu.com/wanghaiguang/archive/2012/07/17/183830.html#Feedback0http://www.shnenglu.com/wanghaiguang/comments/commentRss/183830.htmlhttp://www.shnenglu.com/wanghaiguang/services/trackbacks/183830.html一、概q?/span>
StrategyQ策略)模式又称Policy模式Q用于定义一pd的算法,把它们一个个装hQƈ且它们可相互替换。这里的法q狭义的数据结构或法理论中所讨论的KMP、shell sort{算法,而是指应用程序设计中不同的处理逻辑Q前面所说的狭义的算法只是其中的一部分。Strategy模式使得法与算法的使用者相分离Q减了二者间的耦合度,使得法可独立于使用它的客户而变化;同时Q由于设计粒度的减小Q程序的复用性也得到了进一步提高,分离出来的算法可以更好地适应复用的需要?/span>

二、结?/span>
Strategy模式的结构如下图所C:(x)

 
从结构上看,Strategy模式与State模式有几分相|但二者所讨论的ContextQ情景)h显著的差异:(x)
State模式在于其状态信息分d来保存到一个独立的对象中,以便状态信息的获取或状态的转换QStrategy模式在于可能的法分离出来Q根据需要进行适当的选择。此外,二者的区别q在于,Strategy模式中各个StrategyQ算法、策略)往往用于解决相同的问题,卛_是解军_一问题的不?#8220;{略”?#8220;途径”Q而且Q一ơ只能有一个StrategyZơ应用提供服务;而State模式中的各个State本n往往h一定的差异Q但他们之间存在明显的相互{换的关系Q而且q种转换往往?x)在E序q行q程中经常性地发生Q同时存在一个以上State也是可能的?/span>

区别参考:(x)二者的应用场合不同。状态模式用于处理对象有不同状态(状态机Q的场合Q策略模式用于随不同外部环境采取不同行ؓ(f)的场合。在状态模式中Q状态的变迁是由对象的内部条件决定,外界只需兛_其接口,不必兛_其状态对象的创徏和{化;而策略模式里Q采取何U策略由外部条g军_。所以,有h?#8220;状态模式是完全装且自修改的策略模?#8221;。至于BridgeQ在l构上与前两者都不一样了。要说相g处,是三者都有具有对外接口统一的类Q展现出多态性而已?/span>

三、应?/span>
当存在以下情冉|可考虑使用Strategy模式Q?/span>
1.
许多相关的类仅仅是行为有异?#8220;{略”提供了一U用多个行ؓ(f)中的一个行为来配置一个类的方法?/span>
2.
需要用一个算法的不同变体。例如,你可能会(x)定义一些反映不同的I间/旉权衡的算法,当这些变体实Cؓ(f)一个算法的cdơ时Q可以用策略模式?/span>
3.
法使用客户不应该知道的数据。可使用{略模式以避免暴露复杂的、与法相关的数据结构?/span>
4.
一个类定义了多U行为,q且q些行ؓ(f)在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的StrategycM以代替这些条件语句?/span>
更具体的应用实例包括Q?/span>
1.
以不同的格式保存文gQ?/span>
2.
以不同的方式Ҏ(gu)件进行压~或其他处理Q?/span>
3.
以不同的方式l制/处理相同的图形数据;
{等?/span>

四、D?/span>
下面是一个应用Strategy模式对vectorq行排序的例子,Z化问题,其中的排序Strategy实际上调用的是STL的排序算法:(x)sort和stable_sort?/span>
  1 #include <iostream>
  2 #include <vector>
  3 #include <algorithm>
  4 #include <time.h>
  5 using namespace std;
  6 
  7 template <typename T>
  8 class SortStrategy    // Strategy
  9 {
 10 public:
 11     virtual void Sort( vector<T>& v_t ) = 0;
 12 };
 13 
 14 template <typename T>
 15 class SortQuick : public SortStrategy<T>    // ConcreateStrategy1
 16 {
 17 public:
 18     void Sort( vector<T>& v_t ) { std::sort( v_t.begin(), v_t.end() ); }
 19 };
 20 
 21 template <typename T>
 22 class SortStable : public SortStrategy<T>    // ConcreateStrategy1
 23 {
 24 public:
 25     void Sort( vector<T>& v_t ) { std::stable_sort(v_t.begin(), v_t.end()); }
 26 };
 27 
 28 template <typename T>
 29 class Context {        // Context, who or whose client takes charge of which strategy will be selected
 30 public:
 31     Context() { m_pStrategy = NULL; }
 32     virtual ~Context() { if (m_pStrategy != NULL) delete m_pStrategy; }
 33 
 34     void SetStrategy(SortStrategy<T>* pStrategy);    // select a strategy
 35 
 36     void ReadVector( vector<T>& v_t);
 37     bool SortVector();
 38     void OutputVector();
 39 private:
 40     vector<T> m_vt;
 41     SortStrategy<T>*  m_pStrategy;    // a pointer to current strategy
 42 };
 43 
 44 template <typename T>
 45 void Context<T>::SetStrategy( SortStrategy<T>* pStrategy )
 46 {
 47     if ( NULL != m_pStrategy )
 48         delete m_pStrategy;
 49 
 50     m_pStrategy = pStrategy;
 51 }
 52 
 53 template <typename T>
 54 void Context<T>::ReadVector( vector<T>& v_t)
 55 {
 56     m_vt.clear();
 57     copy( v_t.begin(), v_t.end(), back_inserter( m_vt ) );
 58 }
 59 
 60 template <typename T>
 61 bool Context<T>::SortVector()
 62 {
 63     if ( NULL == m_pStrategy )
 64         return false;
 65 
 66     m_pStrategy->Sort( m_vt );
 67 
 68     return true;
 69 }
 70 
 71 template <typename T>
 72 void Context<T>::OutputVector()
 73 {
 74     copy( m_vt.begin(), m_vt.end(), ostream_iterator<T>( cout, " " ) );
 75 }
 76 
 77 // a functor to generate random int
 78 struct RandGen
 79 {
 80     RandGen(int ratio) { m_ratio = ratio; }
 81     int operator() () { return rand() % m_ratio + 1; }
 82 private:
 83     int m_ratio;
 84 };
 85 
 86 int main()
 87 {
 88     const int NUM = 9;
 89     vector< int > vi;
 90     time_t t;
 91     srand( (unsigned) time(&t) );
 92 
 93     // create a vector with random information
 94     vi.reserve(NUM + 1);
 95     generate_n(back_inserter(vi), NUM, RandGen(NUM));
 96 
 97     Context< int >  con;
 98     con.SetStrategy( new SortQuick<int>() );
 99     con.ReadVector( vi );
100     con.OutputVector();
101 
102     cout << endl;
103 
104     con.SortVector();
105     con.OutputVector();
106 
107     return 0;
108 }

本文转自Q?/span>http://blog.csdn.net/haiyan0106/article/details/1651797

]]>
C++设计模式-Iterator http://www.shnenglu.com/wanghaiguang/archive/2012/07/16/183667.html王v?/dc:creator>王v?/author>Mon, 16 Jul 2012 00:11:00 GMThttp://www.shnenglu.com/wanghaiguang/archive/2012/07/16/183667.htmlhttp://www.shnenglu.com/wanghaiguang/comments/183667.htmlhttp://www.shnenglu.com/wanghaiguang/archive/2012/07/16/183667.html#Feedback0http://www.shnenglu.com/wanghaiguang/comments/commentRss/183667.htmlhttp://www.shnenglu.com/wanghaiguang/services/trackbacks/183667.html一、概q?br />IteratorQP代器Q模式又UCursorQ游标)模式Q用于提供一U方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这栯可能更容易理解:(x)Iterator模式是运用于聚合对象的一U模式,通过q用该模式,使得我们可以在不知道对象内部表示的情况下Q按照一定顺序(由iterator提供的方法)讉K聚合对象中的各个元素?br />׃Iterator模式的以上特性:(x)与聚合对象耦合Q在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持c,如STL的list、vector、stack{容器类及ostream_iterator{扩展iterator?br />Ҏ(gu)STL中的分类Qiterator包括Q?br />Input IteratorQ只能单步向前P代元素,不允怿改由该类q代器引用的元素?br />Output IteratorQ该cP代器和Input Iterator极其怼Q也只能单步向前q代元素Q不同的是该cP代器对元素只有写的权力?br />Forward IteratorQ该cP代器可以在一个正的区间中进行读写操作,它拥有Input Iterator的所有特性,和Output Iterator的部分特性,以及单步向前q代元素的能力?br />Bidirectional IteratorQ该cP代器是在Forward Iterator的基上提供了单步向后q代元素的能力?br />Random Access IteratorQ该cP代器能完成上面所有P代器的工作,它自q有的Ҏ(gu)就是可以像指针那样q行术计算Q而不是仅仅只有单步向前或向后q代?br />q五cP代器的从属关p,如下图所C,其中头A→B表示QA是B的强化类型,q也说明了如果一个算法要求BQ那么A也可以应用于其中?br />
?font color="#999900">1、五UP代器之间的关p?br />vector 和deque提供的是RandomAccessIteratorQlist提供的是BidirectionalIteratorQset和map提供?iterators?ForwardIteratorQ关于STL中iterator的更多信息?br />二、结?br />Iterator模式的UMLl构如下图所C:(x)

三、应?br />Iterator模式有三个重要的作用Q?font color="#999900">
1
Q它支持以不同的方式遍历一个聚?复杂的聚合可用多U方式进行遍历,如二叉树(wi)的遍历,可以采用前序、中序或后序遍历。P代器模式使得改变遍历法变得很容?strong>: 仅需用一个不同的q代器的实例代替原先的实例即可,你也可以自己定义q代器的子类以支持新的遍历,或者可以在遍历中增加一些逻辑Q如有条件的遍历{?font color="#999900">
2
QP代器化了聚合的接?有了q代器的遍历接口Q聚合本w就不再需要类似的遍历接口了,q样q化了聚合的接口?font color="#999900">
3
Q在同一个聚合上可以有多个遍?每个q代器保持它自己的遍历状态,因此你可以同时进行多个遍历?font color="#999900">
4
Q此外,Iterator模式可以为遍历不同的聚合l构Q需拥有相同的基c)提供一个统一的接口,x持多态P代?br /> 单说来,q代器模式也是Delegate原则的一个应用,它将寚w合进行遍历的功能装成独立的IteratorQ不但简化了集合的接口,也得修攏V增 加遍历方式变得简单。从q一点讲Q该模式与Bridge模式、Strategy模式有一定的怼性,但Iterator模式所讨论的问题与集合密切相关Q?造成在Iterator在实Ch一定的Ҏ(gu)性,具体在CZ部分q行讨论?br />
四、优~点
正如前面所_(d)与集合密切相养I限制?Iterator模式的广泛用,׃言Q我不大认同Iterator作ؓ(f)模式提出的观点,但它又确实符合模?#8220;l常出现的特定问题的解决Ҏ(gu)”?特质Q以至于我又不得不承认它是个模式。在一般的底层集合支持cMQ我们往往不愿“避轻重”集合设计成集合 + Iterator 的Ş式,而是遍历的功能直接交由集合完成Q以免犯?#8220;q度设计”的诟病,但是Q如果我们的集合cȝ实需要支持多U遍历方式(仅此一点仍不一定需要考虑 Iterator模式Q直接交由集合完成往往更方便)Q或者,Z与系l提供或使用的其它机Ӟ如STL法Q保持一致时QIterator模式才值得?虑?br />
五、D?br />可以考虑使用两种方式来实现Iterator模式Q内嵌类或者友元类。通常q代c需讉K集合cM的内部数据结构,为此Q可在集合类中设|P代类?font color="#990000">friend classQ但q不利于d新的q代c,因ؓ(f)需要修攚w合类Q添?font color="#990000">friend class语句。也可以在抽象P代类中定?font color="#990000">protected型的存取集合cd部数据的函数Q这栯P代子cd可以讉K集合cL据了Q这U方式比较容易添加新的P代方式,但这U方式也存在明显的缺点:(x)q些函数只能用于特定聚合c,q且Q不可避免造成代码更加复杂?br />
STL的list::iterator、deque::iterator、rbtree::iterator{采用的都是外部Iteratorcȝ形式Q虽然STL的集合类的iterator分散在各个集合类中,但由于各Iteratorcd有相同的基类Q保持了相同的对外的接口Q包括一些traits及tags{,感兴者请认真阅读参?font color="#999900">1?font color="#999900">2Q,从而得它们看h仍然像一个整体,同时也得应用algorithm成ؓ(f)可能。我们如果要扩展STL的iteratorQ也需要注意这一点,否则Q我们扩展的iterator可能无法应用于各algorithm?br />
以下是一个遍历二叉树(wi)的Iterator的例子,Z方便支持多种遍历方式Qƈ便于遍历方式的扩展,其中q用了Strategy模式Q见W记21Q:(x)
Q注Q?font color="#999900">1、虽然下面这个示例是本系列所有示例中p我时间最多的一个,但我不得不承认,它非怸完善Q感兴趣的朋友,可以考虑参考下面的参考材料将其补充完善,或提出宝贉|q意见?font color="#999900">2?我本惌虑其装成与STL风格一致的形式Q得我们遍历二叉树(wi)必须通过Iterator来进行,但由于二叉树(wi)在结构上较线性存储结构复杂,使访问必?通过Iterator来进行,但这不可避免使得BinaryTree的访问变得异帔R烦,在具体应用中q需要认真考虑?font color="#999900">3、以下只提供了Inorder<中序>遍历iterator的实现。)
 1 #include <assert.h>
 2 
 3 #include <iostream>
 4 #include <xutility>
 5 #include <iterator>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 template <typename T>
10 class BinaryTree;
11 template <typename T>
12 class Iterator;
13 
14 template <typename T>
15 class BinaryTreeNode
16 {
17 public:
18      typedef BinaryTreeNode<T> NODE;
19      typedef BinaryTreeNode<T>* NODE_PTR;
20 
21      BinaryTreeNode(const T& element) : data(element), leftChild(NULL), rightChild(NULL), parent(NULL) { }
22      BinaryTreeNode(const T& element, NODE_PTR leftChild, NODE_PTR rightChild)
23          :data(element), leftChild(leftChild), rightChild(rightChild), parent(NULL)
24      {
25          if (leftChild)
26              leftChild->setParent(this);
27          if (rightChild)
28              rightChild->setParent(this);
29      }
30     
31      T getData(voidconst { return data; }
32      NODE_PTR getLeft(voidconst { return leftChild; }
33      NODE_PTR getRight(voidconst { return rightChild; }
34      NODE_PTR getParent(voidconst { return parent; }
35      void SetData(const T& data) { this->data = item; }
36      void setLeft(NODE_PTR ptr) { leftChild = ptr; ptr->setParent(this); }
37      void setRight(NODE_PTR ptr) { rightChild = ptr; ptr->setParent(this); }
38      void setParent(NODE_PTR ptr) { parent = ptr; }
39 private:
40      T data;
41      NODE_PTR leftChild;
42      NODE_PTR rightChild;
43      NODE_PTR parent;   // pointer to parent node, needed by iterator
44 
45      friend class BinaryTree<T>;
46 };

本文转自Q?a >http://www.cnblogs.com/berry/archive/2009/10/12/1581554.html

]]>
singleton模式http://www.shnenglu.com/wanghaiguang/archive/2012/07/13/183112.html王v?/dc:creator>王v?/author>Fri, 13 Jul 2012 00:14:00 GMThttp://www.shnenglu.com/wanghaiguang/archive/2012/07/13/183112.htmlhttp://www.shnenglu.com/wanghaiguang/comments/183112.htmlhttp://www.shnenglu.com/wanghaiguang/archive/2012/07/13/183112.html#Feedback0http://www.shnenglu.com/wanghaiguang/comments/commentRss/183112.htmlhttp://www.shnenglu.com/wanghaiguang/services/trackbacks/183112.html      singleton模式是Gof提出?3中模式之一Q也UCؓ(f)单例模式Q那么简单说一下,什么叫单例模式呢?
      通常我们创徏cȝ对象是用new Object()Q然后就调用该对象里面的Ҏ(gu)Q那么当我们多次使用new Object()的话Q会(x)对系l资源造成一U浪费,当然.net内部已经有垃圑֛收机制可以处理这U浪贏V当然我们ƈ不会(x)再程序里面多ơ用new Object()Q但是,作ؓ(f)一个类的设计者,我们需要负什么责任,除了让别的模块可以调用用之外,我们的设计还需要一U规范,q也是OO里面的规范,singleton模式在这里派上了用场?/p>

      singleton模式的意图:(x)保一个类只能拥有一个实例,q保证逻辑的正性以及良好的效率Qƈ提供一个该实例的全局讉K炏V?br />      singleton模式cdQ单U程singletonQ多U程singleton
      singleton思\Q要让用者只能用一个实例的话,那么必须l过常规的公有缺省构造器

      singleton代码Q?/p>

 1 public class singleton
 2 {
 3     private static singleton instance;
 4     private singleton() { }
 5     public static singleton Instance
 6     {
 7         get
 8         {
 9             if (instance == null)
10             {
11                 instance = new singleton();
12             }
13             return instance;
14         }
15     }
16 }
17 

      W?行:(x)利用U有构造函数绕开pȝ自带的缺省公有构造函敎ͼq样׃ɾcȝ外部不可以直接用new实例化对?br />      W?行:(x)提供一个静态的公有属性,供类外部调用
      W?行:(x)在这里可能存在BUGQ当有两个线E同时操作公有属性时Q常规的话应该返回两个一L(fng)实例Q但是假如当W一个实例还未来得及创徏ӞW二个线E又讉K了它Q显然也?x)执行              new singletonQ)q个语句Q那么这两个对象的引用就不一样了Q可以用object.ReferenceEquals试一下对象的引用是否一栗因此,l大家提供多U程Ҏ(gu)Q请看下面代?/p>

 1 public class singletons
 2 {
 3     private static volatile singletons instances = null;
 4     private static object lockHelper = new object(); 
 5     private singletons() { }
 6     public static singletons Instance
 7     {
 8         get
 9         {
10             if(instances==null)
11             {
12                 lock (lockHelper)
13                 {
14                     if(instances==null )
15                     {
16                         instances = new singletons();
17                     }
18                 }
19             }
20             return instances;
21         }
22     }
23 }

      昄看v来与单线Esingleton差不多,多了volatile 修饰W,q有一个Object对象Q接下来跟大家解释用这些其中的~由
      volatile 修饰W?br />      假如我定义两个变量和两个属?/p>

 1  int a;
 2  volatile int b;
 3  public int GetFirst
 4  {
 5      get { return a; }
 6  }
 7  public int GetSecond
 8  {
 9      get { return b; }
10  }

      GetFirst?x)得到当前线E中a的|而多个线E就?x)有多个a的变量拷贝,而且q些拯之间可以互不相同Q换句话_(d)另一个线E可能改变了它线E内的a|而这个值和当前U程中的ag相同Q那么就造成U程冲突了?br />那么再来看看bQ因?span style="color: #0000ff">volatile 修饰的变量不允许有不同于“?#8221;内存区域的变量拷贝,换句话说Q一个变量经volatile 修饰后在所有线E中都是同步的;MU程改变了它的|所以其他线E立卌取到了相同的|当然加了volatile 修饰的变量存储时?x)比一般变量消耗的资源要多一炏V?/span>

Object对象?br />      对象锁可以保证Lock里面的代码只能同时让一个线E执行,所以确保了一个对象只存在一个实例?/span>

      同样的需求可以有不同的方法实玎ͼ以下是另外一U实现singleton模式的代码,代码更简单,不够有缺PL(fng)

1 public class singletonss
2  {
3      public static readonly singletonss Instance = new singletonss();
4      private singletonss() { }
5  }

      首先定义一个静态的只读实例Q当然也需要私有构造器l过~省构造器Q这样子也可以保证多U程里也只诞生一个对象实例,因ؓ(f).Netcd初始化机制保证只有一个线E执行了静态构造器。当然这么少的代码也可以实现singletonQ但是静态构造器不支持参敎ͼ也不能重构,因ؓ(f)?Net机制里面只允怸个类拥有一个静态构造器而且是私有的Q外部不能调用只能供pȝ调用Q所以我们不能用参数?br />
本文转自Q?a >http://www.cnblogs.com/magicchaiy/archive/2010/12/02/1894826.html
其他链接Q?a href="http://www.shnenglu.com/dyj057/archive/2005/09/20/346.html">http://www.shnenglu.com/dyj057/archive/2005/09/20/346.html



]]>
C++设计模式之一 工厂模式Q简单工厂、工厂和抽象工厂Q?/title><link>http://www.shnenglu.com/wanghaiguang/archive/2012/07/12/182948.html</link><dc:creator>王v?/dc:creator><author>王v?/author><pubDate>Thu, 12 Jul 2012 00:44:00 GMT</pubDate><guid>http://www.shnenglu.com/wanghaiguang/archive/2012/07/12/182948.html</guid><wfw:comment>http://www.shnenglu.com/wanghaiguang/comments/182948.html</wfw:comment><comments>http://www.shnenglu.com/wanghaiguang/archive/2012/07/12/182948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/wanghaiguang/comments/commentRss/182948.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/wanghaiguang/services/trackbacks/182948.html</trackback:ping><description><![CDATA[     摘要:      今天开始这个系列之前,心里有些恐慌Q毕竟园子里的高手关于设计模式的l典文章很多很多Q特别是大侠李会(x)军、吕震宇 老师的文章更是堪U经典。他们的文笔如行云流_(d)例子zL生动Q讲解深入浅出。好在他们都是用C#描述Q也没有提供必要的源码下载,所以我q里用C++?现。首先我惛_明的是我的文W绝对不如他们的好,例子也没有他们的形象Q不q我打算把C+...  <a href='http://www.shnenglu.com/wanghaiguang/archive/2012/07/12/182948.html'>阅读全文</a><img src ="http://www.shnenglu.com/wanghaiguang/aggbug/182948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/wanghaiguang/" target="_blank">王v?/a> 2012-07-12 08:44 <a href="http://www.shnenglu.com/wanghaiguang/archive/2012/07/12/182948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Active Object 模式 http://www.shnenglu.com/wanghaiguang/archive/2012/07/11/182760.html王v?/dc:creator>王v?/author>Wed, 11 Jul 2012 00:14:00 GMThttp://www.shnenglu.com/wanghaiguang/archive/2012/07/11/182760.htmlhttp://www.shnenglu.com/wanghaiguang/comments/182760.htmlhttp://www.shnenglu.com/wanghaiguang/archive/2012/07/11/182760.html#Feedback0http://www.shnenglu.com/wanghaiguang/comments/commentRss/182760.htmlhttp://www.shnenglu.com/wanghaiguang/services/trackbacks/182760.htmlActive Object 模式是Command模式的一U,是实现多U程控制的一古老技?.

在《敏捯Y件开发》这本书中描q的法如下Q?
1、构造一个命令。(实现Command模式的一个命令)
2、将该命令放?span class="hilite1">Active Object EngineQ也是攑օ一个队列,LinkedListQ?
3、从该Engine取出一个命令,执行Q若该命令没有执行过Q设为执行过Q然后将自己加入队列NQ若执行q,判断该命令执行需要的事g发生没有Q未发生Q再自己加入队列尾部。事件发生了Q将需要执行的命o加入队列N?

Active Object模式不属于《Design Pattern?3模式。实际上Q她是一U特D的Command Queue。其Ҏ(gu)之处在于Q?/div>
1. 队列的拥有者会(x)序地执行队列中所有Command对象的ExecuteҎ(gu)。(q个其实不算Ҏ(gu)Q?/div>
2.Command对象在自qExecuteҎ(gu)l束前,可以把一个新的command对象Q实际上常常是这个command对象自己Q再加到队列的尾部?/div>
看出来了吗,q个队列有可能不?x)终止的Q他可以一直执行下厅R这个可以作Z个应用或者服务的L块了Q想像一下她可以作多事情吧?/div>
《ASP》指个模式可以用来在一个线E中处理多Q务的问题Q!Q?^_^ 太cool了?/div>
如何处理呢?你可以把每个command对象看作是一个Q务。他在Execute函数中,处理自己的Q务,在Q务告一D落Ӟ记录自己的状态,然后把自己插入到队列的尾部,l束ExecuteҎ(gu)。当队列轮完一周后Q又?x)再ơ执行这个command对象的ExecuteҎ(gu)?^_^ 很cool吧?/div>
那么q种Ҏ(gu)和多U程的方法相比有什么有~点呢?
最大的优点是,所有的command都在同一个线E中Q因此切换时Q不需要进入内核模式!Q超高效啊!Q而且Q可以有很多很多的commandQ数量上q远过多线E的数量?/div>
~点嘛,是这U方法需要用戯己来实现调度Q另外这其实是一U非剥夺模式的多dQ如果command处理不好Q就?x)连累其它所有的commandQ因此实际上比多U程要更复杂。(嘿嘿Q程序员能够怕麻烦吗Q)
q有一点,Active Objectq行于单U程Q也是_(d)她不能n受多处理器或多处理器核心带来的性能上的改善?/div>
其实Q这最后一Ҏ(gu)非常致命的一炏V也是_(d)在当前intel的超U程CPU机器上,如果pȝ的负担ƈ不重的时候。Active Object的效率有可能比多U程更低?/div>
AnywayQ这是一个非常有的模式。只是一般的E序员可能没有机?x)用到?br />
本文转自Q?a href="http://www.shnenglu.com/tx7do/archive/2010/02/28/108617.aspx">http://www.shnenglu.com/tx7do/archive/2010/02/28/108617.aspx


]]>Command 模式http://www.shnenglu.com/wanghaiguang/archive/2012/07/10/182608.html王v?/dc:creator>王v?/author>Tue, 10 Jul 2012 05:40:00 GMThttp://www.shnenglu.com/wanghaiguang/archive/2012/07/10/182608.htmlhttp://www.shnenglu.com/wanghaiguang/comments/182608.htmlhttp://www.shnenglu.com/wanghaiguang/archive/2012/07/10/182608.html#Feedback0http://www.shnenglu.com/wanghaiguang/comments/commentRss/182608.htmlhttp://www.shnenglu.com/wanghaiguang/services/trackbacks/182608.html阅读全文

]]>
2021ھþþƷ| ɫۺϾþɫ| þþƷվ| ҹƷþþþ| 999þþѾƷ| 99ƷþþþĻ| þƵһ| avþþþþòվ| ۿ ۺϾþþþùɫ ŷ һ | ݺݺݾþ| 99þۺϾƷ| ɫۺϾþþþۺ99| þ99Ʒ| ľþþþ| ޹Ʒþþò| þ97Ʒþþþþþò| þۺɫݺ| Ʒþһ| þþþþþþþþþƷ| þҹӰ| þþƷav| þԭƷ| þþþһ| þþƷ77777| Ļ޹˾þþƷ| ˾þþƷ| jizzjizzƷþ| ɫۺϾþʮ·| þþƷav鶹ѿ| þһۺ| þӰӹ| ŷƷһþĻ| 91޹˾þþƷַ| ھƷþþþӰԺһ| պ޾Ʒþ| þþƷѹۿ| 2021ھƷþþþþӰԺ| Ժձһձþ| þþƷ99͵| 91Ʒ91þþþþ| þۺŷ|