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

来源:互联网 发布:网上白家乐能破解软件 编辑:程序博客网 时间:2024/06/15 15:19

【观察者模式】

         多个观察者同时监听一个主题,一旦主题对象发生改变便会通知所有的观察者对象,并相应自己的更新事件!
                                   
       实现过程(基于类的理解):
       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.抽象方法必须在派生类中被重写,与接口相似,但虚方法不必;

【总结】

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