状态模式
2016-06-10 15:49
281 查看
//定义:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
优点
1、封装了转换规则。
2、枚举可能的状态,在枚举状态之前需要确定状态种类。
3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点
1、状态模式的使用必然会增加系统类和对象的个数。
2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
3、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
//状态模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class Work//投票类,与状态类是聚合关系,弱拥有。
{
private State count;//声明状态父类,以作承接。
public Work()
{
count = new normal();//接收第一个状态
}
private double num;
public double Num//获取数字
{
get
{
return num;
}
set
{
num = value;
}
}
public void SetState(State s)//设置状态
{
count=s;
}
public void writeProgram()//输出状态
{
count.writeProgram(this);
}
}
public abstract class State//状态父类
{
public abstract void writeProgram(Work w);//虚方法,输出
}
public class normal : State//正常投票
{
public override void writeProgram(Work w)//前5次成功,否则转入下一个状态
{
if (w.Num < 5)
{
Console.WriteLine("投票成功!!");
}
else
{
w.SetState(new black());
w.writeProgram();
}
}
}
public class black : State//拉黑类
{
public override void writeProgram(Work w)//拉黑或者转入下一个状态
{
if (w.Num >= 5&&w.Num<8)
{
Console.WriteLine("投票过多!拉入黑名单!!");
}
else
{
w.SetState(new malice());
w.writeProgram();
}
}
}
public class malice : State//直接禁止!
{
public override void writeProgram(Work w)//
{
if (w.Num >= 8)
{
Console.WriteLine("恶意投票,以后禁止登入!");
}
}
}
class Program
{
static void Main(string[] args)
{
Work vote = new Work();
Console.WriteLine("输入投票次数");
int n = Console.Read();
vote.Num = n-48;
vote.writeProgram();
Console.Read();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class Work//请假,与状态类是聚合关系,弱拥有。
{
private bool fin=false;
public bool Fin
{
get{return fin;}
set{fin=value;}
}
private State count;//声明状态父类,以作承接。
public Work()
{
count = new jingli();//接收第一个状态
}
private double num;
public double Num//获取数字
{
get
{
return num;
}
set
{
num = value;
}
}
public void SetState(State s)//设置状态
{
count=s;
}
public void writeProgram()//输出状态
{
count.writeProgram(this);
}
}
public abstract class State//状态父类
{
public abstract void writeProgram(Work w);//虚方法,输出
}
public class jingli : State//正常投票
{
public override void writeProgram(Work w)//前5次成功,否则转入下一个状态
{
if (w.Fin == false)
{
Console.WriteLine("不同意审批!!");
return;
}
else
{
w.SetState(new day());
w.writeProgram();
}
}
}
public class day : State//审批天数
{
c141
public override void writeProgram(Work w)//
{
if (w.Num<=3)
{
Console.WriteLine("允许请假,审批结束!!");
}
else
{
w.SetState(new bumen());
w.writeProgram();
}
}
}
public class bumen : State//直接禁止!
{
public override void writeProgram(Work w)//
{
Console.WriteLine("部门审批,审批直接结束!");
}
}
class Program
{
static void Main(string[] args)
{
Work vote = new Work();
Console.WriteLine("输入请假天数");
int n = Console.Read();
vote.Num = n-48;
Console.Write(vote.Num);
vote.Fin = true;
vote.writeProgram();
Console.Read();
}
}
}
//定义:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
优点
1、封装了转换规则。
2、枚举可能的状态,在枚举状态之前需要确定状态种类。
3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点
1、状态模式的使用必然会增加系统类和对象的个数。
2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
3、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
//状态模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class Work//投票类,与状态类是聚合关系,弱拥有。
{
private State count;//声明状态父类,以作承接。
public Work()
{
count = new normal();//接收第一个状态
}
private double num;
public double Num//获取数字
{
get
{
return num;
}
set
{
num = value;
}
}
public void SetState(State s)//设置状态
{
count=s;
}
public void writeProgram()//输出状态
{
count.writeProgram(this);
}
}
public abstract class State//状态父类
{
public abstract void writeProgram(Work w);//虚方法,输出
}
public class normal : State//正常投票
{
public override void writeProgram(Work w)//前5次成功,否则转入下一个状态
{
if (w.Num < 5)
{
Console.WriteLine("投票成功!!");
}
else
{
w.SetState(new black());
w.writeProgram();
}
}
}
public class black : State//拉黑类
{
public override void writeProgram(Work w)//拉黑或者转入下一个状态
{
if (w.Num >= 5&&w.Num<8)
{
Console.WriteLine("投票过多!拉入黑名单!!");
}
else
{
w.SetState(new malice());
w.writeProgram();
}
}
}
public class malice : State//直接禁止!
{
public override void writeProgram(Work w)//
{
if (w.Num >= 8)
{
Console.WriteLine("恶意投票,以后禁止登入!");
}
}
}
class Program
{
static void Main(string[] args)
{
Work vote = new Work();
Console.WriteLine("输入投票次数");
int n = Console.Read();
vote.Num = n-48;
vote.writeProgram();
Console.Read();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class Work//请假,与状态类是聚合关系,弱拥有。
{
private bool fin=false;
public bool Fin
{
get{return fin;}
set{fin=value;}
}
private State count;//声明状态父类,以作承接。
public Work()
{
count = new jingli();//接收第一个状态
}
private double num;
public double Num//获取数字
{
get
{
return num;
}
set
{
num = value;
}
}
public void SetState(State s)//设置状态
{
count=s;
}
public void writeProgram()//输出状态
{
count.writeProgram(this);
}
}
public abstract class State//状态父类
{
public abstract void writeProgram(Work w);//虚方法,输出
}
public class jingli : State//正常投票
{
public override void writeProgram(Work w)//前5次成功,否则转入下一个状态
{
if (w.Fin == false)
{
Console.WriteLine("不同意审批!!");
return;
}
else
{
w.SetState(new day());
w.writeProgram();
}
}
}
public class day : State//审批天数
{
c141
public override void writeProgram(Work w)//
{
if (w.Num<=3)
{
Console.WriteLine("允许请假,审批结束!!");
}
else
{
w.SetState(new bumen());
w.writeProgram();
}
}
}
public class bumen : State//直接禁止!
{
public override void writeProgram(Work w)//
{
Console.WriteLine("部门审批,审批直接结束!");
}
}
class Program
{
static void Main(string[] args)
{
Work vote = new Work();
Console.WriteLine("输入请假天数");
int n = Console.Read();
vote.Num = n-48;
Console.Write(vote.Num);
vote.Fin = true;
vote.writeProgram();
Console.Read();
}
}
}
相关文章推荐
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- c#调用COM组件
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 土人系列AS入门教程 -- 对象篇
- 文件遍历排序函数
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值