设计模式--观察者模式、状态模式

2019-04-14 18:50发布

【观察者模式】

         多个观察者同时监听一个主题,一旦主题对象发生改变便会通知所有的观察者对象,并相应自己的更新事件!                                            实现过程(基于类的理解):        1.主题对象要实现的功能:添加、移除观察者,通知观察者(所谓通知,就是调用执行每一个观察者的update方法),具体主题要能够监视悲观者的状态。        2.观察者实现的功能:更新被观察者状态。具体实现在构造函数中要引入被观察!        3.客户端认识:初始化被观察者(主题对象)----与观察者建立连接----实现状态方法----通知观察者       缺点:具体观察者类要依赖于抽象观察者,一旦没有抽闲观察者,通知的功能将无法实现。       解决方法:委托 【委托】         委托可以称为函数的抽象。自己理解为,委托为函数方法提供了一个容器,这些方法可以不在同一个类,但是这些方法要有相同的参数列表和参数返回类型。        好处:可以替换掉接口中必须存在的接口,和抽象类中要实现的一般方法(去除掉列表的使用)        实现方法:public event EventHandler Update;  //声明一个委托事件Update                          public void Notify()      //调用notify方法时,所有被update()搭载的方法都会被执行                          {                                Update();                         }         客户端:boss.Update+=new Eventhandler(tongshi1.CloseStokMarket);  //将关闭股票程序的方法搭载到委托                       boss.Update+= new Eventhandler(tongshi2.CloseNBAGame);//观察者具体操作(关闭NBA比赛)搭载到委托                       boss.Notify(); //上面搭载的方法都会执行

【状态模式】

  状态模式,内部行为根据状态的改变而改变。比如“喝水”这个行为是在“渴了”的状态下执行的。而往往一个对象的行为和状态都不只是一个,这样状态模式提供一种自改变的方法,可以由一个状态转变成另一个状态,都要引起行为的改变!               从上图可以得到状态模式的实现过程:                1.context实例化引入当前状态,然后定义状态属性,用于接收状态转移;实现request()方法,对状态进行控制:state.Handle(this);  //调用状态的控制执行     2.状态基类中定义抽象控制方法Handle();                3. 具体状态中重写控制方法,执行完毕后要实现context实例化的下一个状态转换:                           class ConcreteStateA:State                           {                                   public overide void Handle(Context context)                                  {                                           context.State=new ConcreteStateB();  //实现状态转移                                  }                            }              4.客户端只要初始化最初状态,然后不断request()即可获得下一状态的行为执行:                    Context c=new Context(new ConcreteStateA());                    c.request();                    c.request();       优势:         可以将较长的方法进行分解;自主化实现状态的转换,而且状态类的添加都不会受影响。因此决定他的使用范围:当对象的行为根据状态的变化而变化时,首选状态模式。

【适配器模式】

       适配器(Adapter)实际上实现的是一个接口的转换过程,将两个不适配的类连接在一起。                                        
       思考:如何能将两个毫不接口不一样的类连接在一起?         1.定义目标类中request为虚方法:virtual         2.定义要连接的类Adaptee中的特殊要求方法         3.适配器实例化Adaptee:private Adaptee adaptee=new Adaptee();           重写request()实现与target连接,并实现specificrequest()方法

【virtual方法 VS abstract方法】

       在代码编写的过程中有时候会虚方法,有时候用到抽象方法,而且都会有重写,那他们有什么区别呢?               1.抽象方法必须定义在抽象类中;        2.抽象方法是强制子类覆盖的方法,否则无法实现实例化;虚方法必须有实现部分(大括号),抽象方法不提供实现部分。      //抽象方法 public abstract class Animal { public abstract void Sleep(); public abstract void Eat(); } //虚方法 public class Animal { public virtual void Sleep(){} public virtual void Eat(){} }     3.抽象方法必须在派生类中被重写,与接口相似,但虚方法不必;

【总结】

        学习过程中老是对设计模式有种若隐若现的感觉,命名很熟悉,但是具体实现过程却发现无从下手,在今后的学习过程中要不断总结才行!