设计模式之行为型模式三
行为型模式:
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
简单工厂模式的不足:
由于工厂本身包括了所有的收费方式,商场是可能经常性的更改打折额度和返利额度,每次维护或扩展收费方法都要改动这个工厂,以致代码需重新编译部署,很麻烦
方法:
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); } } } //具体聚集类中有用于存放聚合对象的变量,对抽象聚集类重写,还有聚集总数,和声明一个索引器