首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式之行为型模式三

2013-01-21 
设计模式之行为型模式三行为型模式:策略模式它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模

设计模式之行为型模式三

行为型模式:


策略模式

    它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。


简单工厂模式的不足:

    由于工厂本身包括了所有的收费方式,商场是可能经常性的更改打折额度和返利额度,每次维护或扩展收费方法都要改动这个工厂,以致代码需重新编译部署,很麻烦


方法:

         1,定义一个所有支持的算法的公共接口

         2,将所有具体算法或行为封装在一起

         3,维护对公共接口的引用

        客户端代码是将所有的算法实例化

 

这个模式涉及到三个角色:

        

     环境(Context)角色:持有一个Strategy类的引用。

     抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

     具体策略(ConcreteStrategy)角色:包装了相关的算法或行为

 

优点:

     使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于"可插入式(Pluggable)的算法"

 

个人理解:


     策略模式与工厂模式

        工厂模式是将需要实例化的所有对象放到一个类中,然后在客户端直接使用工厂的方法,实现不同对象的不同操作

策略模式是将工厂中的方法提取出来,然后将需要实例化的对象都放到了客户端去实例。当我需要添加不同的策略时,只在客户端添加它的实例即可,然后将对象作为参数传到策略模式中即可

 

策略模式结构图:

      设计方式之行为型模式三

课本实例:商场打折

 

代码如下:

//Iterator迭代器抽象类         abstract class Iterator         {             public abstract object First();             public abstract object Next();             public abstract object IsDone();             public abstract object CurrentItem();         } //迭代器就是对一个聚集对象遍历  //ConcreteIterator具体迭代器类,继承Iterator         class ConcreteIterator : Iterator         { //创建了一个具体聚集对象             private ConcreteAggregate aggregate;              private int current = 0;              public ConcreteIterator(ConcreteAggregate aggregate)             {                 this.aggregate = aggregate;              } //初始化时将具体的聚集对象传入             public override object First()             {                 return aggregate[0];             }             public override object Next()             {                 object ret = null;                 current++;                 if (current < aggregate.Count)                 {                     ret = aggregate[current];                 }                 return ret;             }              public override object IsDone()             {                 return current >= aggregate.Count ? true : false;             }             public override object CurrentItem()             {                 return aggregate[current];             }         } //具体迭代器就是对具体聚集对象的操作,也是对抽象迭代器的重写  //Aggregate         abstract class Aggregate         {             public abstract Iterator CreateIterator();         } //抽象聚集类就是要创建迭代器   //ConcreteAggregate具体聚集类 继承Aggregate         class ConcreteAggregate : Aggregate         {             private IList<object> items = new List<object>();             public override Iterator CreateIterator()             {                 return new ConcreteIterator(this);             }             public int Count             {                 get { return items.Count; }             }             public object this[int index]             {                 get { return items[index]; }                 set                 {                     items.Insert(index, value);                 }              }         } //具体聚集类中有用于存放聚合对象的变量,对抽象聚集类重写,还有聚集总数,和声明一个索引器 



2楼w1230220100233天前 12:59
蛮不错的啊 推荐一本书 大家设计模式——程杰 让人耳目一新的教程
Re: hejingyuan63天前 13:00
回复w123022010023n是,我看了
1楼lfmilaoshi4天前 20:15
加油。。。。
Re: hejingyuan64天前 10:24
回复lfmilaoshin嗯

热点排行