【观察者模式】
多个观察者同时监听一个主题,一旦主题对象发生改变便会通知所有的观察者对象,并相应自己的更新事件!
实现过程(基于类的理解):
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.抽象方法必须在派生类中被重写,与接口相似,但虚方法不必;
【总结】
学习过程中老是对设计模式有种若隐若现的感觉,命名很熟悉,但是具体实现过程却发现无从下手,在今后的学习过程中要不断总结才行!