如果保存全部信息,我们可以使用Clone实现,但如果只保存部分信息,就应该有一个独立的Memento备忘录类。
8、Observer 观察者观察者模式也叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,是它们能够主动更新自己。这也是很常用的,像委托事件就是这种模式
核心是将所有通知者抽象类中用一个集合放所有观察者们。当通知者ConcreateSubject发起Notify通知时,逐个调用集合中观察者进行Update更新。
abstract class Subject{
private IList<Observer> observers = new List<Observer>();
// 增加观察者
public void Attach(Observer observer)
{
observers.Add(observer);
}
// 移除观察者
public void Detach(Observer observer)
{
observers.Remove(observer);
}
// 通知
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
}
当一个对象的改变需要通知其他对象时使用,一般这种通知可能通过异步来处理。
9、State 状态在状态模式中,类的行为时基于它的状态改变的。就是当一个对象的内部状态发生改变时改变它的行为。主要解决当控制一个对象状态转换的条件表达式过于复杂时,把判断的逻辑迁移到表示不同状态的一系列类中,达到给功能类瘦身的目的。
上面结构图中将状态单独从Context功能类中抽出来,先有一个抽象的状态类,然后具体不同的状态可以继承实现不同状态的Handle处理行为,最后把抽象状态聚合放到Context中去,最终调用Context的Request会根据不同的状态触发不同的Handle行为。
看下核心的代码。也可以在每一个状态子类Handle行为中设置Context的下一个状态,下次调用Request就触发相应的状态行为。
核心就是将状态和行为放入一个对象中。这么多种设计模式都有很多相像的地方,反正就是面向对象,分分合合,像前后端一样,各有优劣。这里就和命令模式处理的问题很像,都可以用作if分支语句的代替。通过状态模式可以很容易的增加新的状态,把状态行为封装起来,减轻了功能类。
10、Strategy 策略策略模式定义一个类的行为算法可以在运行时更改, 把这些算法一个个封装起来,并使它们可以相互替换。
和前面状态模式结构图无差别,就是用策略代替了状态,描述不同的问题,解决方法一样。硬要找个不同,大概就是在Context中,状态模式调用时会传递本身引用到各个子状态的以实现状态的改变,策略模式中不需要传递,只在初始化时指定策略。