辽宁省营商环境建设局网站杭州品牌设计公司有哪些
辽宁省营商环境建设局网站,杭州品牌设计公司有哪些,东莞公司网站,深圳市住房建设局网站#x1f680;简介
状态模式是一种行为设计模式#xff0c;它允许对象在其内部状态改变时改变其行为#xff0c;我们可以通过创建一个状态接口和一些实现了该接口的状态类来实现状态模式。然后#xff0c;我们可以创建一个上下文类#xff0c;它会根据其当前的状态对象来改…简介
状态模式是一种行为设计模式它允许对象在其内部状态改变时改变其行为我们可以通过创建一个状态接口和一些实现了该接口的状态类来实现状态模式。然后我们可以创建一个上下文类它会根据其当前的状态对象来改变其行为。 状态模式包含以下主要角色。 环境Context角色也称为上下文它定义了客户程序需要的接口维护一个当前状态并将与状态相关的操作委托给当前状态对象来处理。 抽象状态State角色定义一个接口用以封装环境对象中的特定状态所对应的行为。 具体状态Concrete State角色实现抽象状态所对应的行为。
案例
抽象状态
public interface IState
{void Handle(Context context);
}
具体状态
ConcreteStateA和ConcreteStateB它们都实现了IState接口。
IState接口定义了一个Handle方法这个方法接受一个Context对象作为参数。Context对象持有当前的状态。
在ConcreteStateA的Handle方法中它将Context的状态改变为ConcreteStateB。同样在ConcreteStateB的Handle方法中它将Context的状态改变为ConcreteStateA。
这样Context对象的状态就在ConcreteStateA和ConcreteStateB之间不断切换。
这就是状态模式的基本思想当一个对象的内在状态改变时允许改变其行为这个对象看起来像是改变了其类。
public class ConcreteStateA : IState
{public void Handle(Context context){context.State new ConcreteStateB();}
}public class ConcreteStateB : IState
{public void Handle(Context context){context.State new ConcreteStateA();}
}环境角色
环境角色有时候也被称为上下文角色它定义了客户端需要的接口并且维护一个具体状态角色的实例这个实例定义当前状态。
在这个类中首先定义了一个私有的IState类型的_state变量用于存储当前的状态。
然后定义了一个构造函数接收一个IState类型的参数用于初始化_state变量。
接着定义了一个公有的State属性用于获取或设置_state变量的值。在设置_state变量的值时会输出当前状态的类型名。
最后定义了一个名为Request的方法该方法会调用_state变量的Handle方法用于处理请求。这个方法的参数是当前的Context实例这样就可以在Handle方法中改变当前的状态。
public class Context
{private IState _state;// Constructorpublic Context(IState state){this.State state;}// Gets or sets the statepublic IState State{get { return _state; }set{_state value;Console.WriteLine(State: _state.GetType().Name);}}public void Request(){_state.Handle(this);}
}
测试
class MyClass
{public static void Main(string[] args){Context context new Context(new ConcreteStateA());// 不断地进行请求同时更改状态context.Request();context.Request();context.Request();context.Request();}
}
运行结果
在测试类中我们创建了一个Context对象并给它设置了初始状态ConcreteStateA。然后我们连续调用四次context.Request()方法。由于ConcreteStateA和ConcreteStateB在处理请求后会互相转换所以输出结果会是A、B、A、B的交替出现。 优缺点 优点 将所有与某个状态有关的行为放到一个类中并且可以方便地增加新的状态只需要改变对象状态即可改变对象的行为。 允许状态转换逻辑与状态对象合成一体而不是某一个巨大的条件语句块。 缺点 状态模式的使用必然会增加系统类和对象的个数。 状态模式的结构与实现都较为复杂如果使用不当将导致程序结构和代码的混乱。 状态模式对开闭原则的支持并不太好。
使用场景
当一个对象的行为取决于它的状态并且它必须在运行时根据状态改变它的行为时就可以考虑使用状态模式。 一个操作中含有庞大的分支结构并且这些分支决定于对象的状态时。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89011.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!