希望通过记录一些关键点做到实际开发中能够得心应手。
状态模式这个模式可能工作中会遇到,将可以互换的行为封装起来,然后使用委托的方法,决定使用哪一个行为,状态基转移场景
这种设计会大量新增状态类,对于一些复杂场景会非常管用;对一些简单场景,比如状态里面只有一个处理函数,状态基转换也比较简单,顺序递增,可能只需要封装函数即可。
int state = 0;
switch (state) {
case 0:
DoStateStart();
break;
case 1:
DoStateProcess();
break;
case 2:
DoStateStop();
break;
default:
break;
}
void DoStateStart()
{
...
state++;
}
void DoStateProcess()
{
...
state++;
}
void DoStateStop()
{
...
state = 0;
}
策略模式
定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。这也是“多用组合,少用继承”的设计原则,用HAS-A(有一个)代替IS-A(是一个)
继承:
组合:
观察者模式
定义了对象只看的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
观察者是否需要持有被观察者对象的实例?持有的话,由观察者调用被观察者的注册接口和取消注册接口,但是被观察者的生命周期需要关注和管理
观察者通过notifyObserver接口通知被观察者,这是push,而不是被观察者来调用观察者的接口,这是pull。
装饰者模式目的是想在原来的基类的基础上增加些功能,一种设计思想是通过继承的方式不断增加子类,而且需要不可避免的修改基类的函数,可能代码长这样
class Base
{
virtual int Cost()
{
int cost = 0;
if (HasTea()) {
cost += 2;
}
if (HasMilk()) {
cost += 3;
}
}
virtual bool HasTea() = 0;
virtual bool HasMilk() = 0;
}
class A : public Base
{
virtual bool HasTea() {return false;}
}
class B : public Base
{
virtual bool HasMilk() {return true;}
}
这种设计违反了设计原则:开放-关闭原则,类应该对扩展开放,对修改关闭 。也就是基类在稳定之后尽可能不要再修改
装饰者和被装饰者应该具有相同的基类,或者装饰者要继承被装饰者,这样做的目的是为了在使用被装饰者的地方可以使用装饰者替代;这里使用继承的目的仅此而已;装饰者内部需要引用被装饰者,装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以打到特定的目的。装饰者定义;我们平时使用I/O相关类使用的就是装饰者设计模式



