设计模式之行为型模式二
行为型模式:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
优点:
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它.
接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构.结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用.
在客户端可以随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性.
职责链模式结构图:
没有职责链模式:如图
这样的话我需要自己和公司的每一个层级都发生耦合关系。
课本实例:申请加薪
代码如下:
中介者模式用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互
优点:
中介者的出现减少了各个colleague的耦合,使得可以独立地改变和复用各个colleague类和中介者。
由于把对象如何协作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度上看待系统。
缺点:
由于具体中介者控制了集中化,于是就把交互复杂性变为了中介者的复杂性。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
中介者模式结构图:
课本实例:美国和伊拉克
代码如下:
课本实例:男人女人成功失败的状态
代码如下:
//状态的抽象类和人的抽象类 abstract class Action { //得到男人结论或反应 public abstract void GetManConclusion(Man concreteElementA); //得到女人结论或反应 public abstract void GetWomanConclusion(Woman concreteElementA); } abstract class Person { public abstract void Accept(Action visitor); } //成功 class Success : Action { public override void GetManConclusion(Man concreteElementA) { Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人", concreteElementA.GetType().Name, this.GetType().Name); } public override void GetWomanConclusion(Woman concreteElementB) { Console.WriteLine("{0}{1}时,背后大多有一个不成功的男人",concreteElementB.GetType().Name, this.GetType().Name); } } //失败 class Failing : Action { public override void GetManConclusion(Man concreteElementA) { Console.WriteLine("{0}{1}时,闷头喝酒,谁也不用劝", concreteElementA.GetType().Name, this.GetType().Name); } public override void GetWomanConclusion(Woman concreteElementB) { Console.WriteLine("{0}{1}时,眼泪汪汪,谁也劝不动", concreteElementB.GetType().Name, this.GetType().Name); } } //男人类和女人类 class Man : Person { public override void Accept(Action visitor) { visitor.GetManConclusion(this); } } class Woman : Person { public override void Accept(Action visitor) { visitor.GetWomanConclusion(this); } } //对象结构 class ObjectStructure { private IList<Person> elements = new List<Person>(); //增加 public void Attach(Person element) { elements.Add(element); } //移除 public void Detch(Person element) { elements.Remove(element); } //查看显示 public void Display(Action visitor) { foreach (Person e in elements) { e.Accept(visitor); } } }