当前:单实例 状态模式
模式价值:
1性能价值:提高效率,保证只创建一个对象。
2机能价值:对该对象从操作都作用在一个对象上,这是机能需要。
需求
动作 | 走状态 | 停状态 | 动作后状态 |
走行 | 不动作 | 走行 | 进入=>走行状态 |
停止 | 走行 | 不动作 | 进入=>停止状态 |
发射 | 辅助瞄准 | 精准瞄准 | 状态不变 |
测试用例
步骤 | 规格 |
初始化 | 停状态 |
停止 | 不动作 |
发射 | 精准瞄准 |
走行 | 走行 |
发射 | 辅助瞄准 |
走行 | 不动作 |
停止 | 停止 |
类图
1.标准类图
扫描二维码关注公众号,回复:
17490051 查看本文章

2.本实例类图
代码解析
代码
java实现
class Function{
public String mStr;
Function(String str){
mStr = str;
exe();
}
public void exe() {
System.out.println(mStr);
}
};
// 坦克
interface IStateTank{
//走
void run();
//停
void stop();
//射击
void shot();
}
// 上下文
interface IContext{
void changeState(IStateTank state);
void run();
void stop();
void shot();
}
///* abstract *//
abstract class State implements IStateTank{
IContext mContext;
protected State(IContext c) {
mContext = c;
}
}
///* Concrete *//
class RunStae extends State{
static IStateTank mStateTank = null;
private RunStae(IContext c) {
super(c);
}
public void run() {
new Function("机能不运行:走行==走行");
}
public void stop() {
mContext.changeState(StopStae.getRunState(mContext));
System.out.println("变更:走行=>停止");
}
public void shot() {
new Function("辅助瞄准");
}
static IStateTank getRunState(IContext c) {
if(mStateTank == null) {
mStateTank = new RunStae(c);
}
return mStateTank;
}
}
class StopStae extends State{
static IStateTank mStateTank = null;
private StopStae(IContext c) {
super(c);
}
public void run() {
new Function("走行机能运行");
mContext.changeState(RunStae.getRunState(mContext));
System.out.println("变更:停止=>走行");
}
public void stop() {
new Function("机能不运行:停止==停止");
}
public void shot() {
new Function("精准瞄准");
}
public static IStateTank getRunState(IContext c) {
if(mStateTank == null) {
mStateTank = new StopStae(c);
}
return mStateTank;
}
}
class ContextTank implements IContext{
IStateTank mState;
public ContextTank(){
mState = StopStae.getRunState(this);
}
public void changeState(IStateTank state) {
mState = state;
}
public void run() {
mState.run();
}
public void stop() {
mState.stop();
}
public void shot() {
mState.shot();
}
}
class A{
static A ma;
static public A get() {
return ma;
}
}
public class Client {
public static void main(String[] args) {
System.out.println("hello worldff !");
ContextTank tank = new ContextTank();
tank.stop();
tank.shot();
tank.run();
tank.shot();
tank.run();
tank.stop();
}
}
运行结果
说明
状态模式中state类Context类间的关系可以有多种处理方式,这里采用了单实例的方式来实现。
因为单实例没有什么太多可说的,即使+线程等各种情况,这也就是个需求而已。
没有太多的设计价值可体现,所以就在这里运用了一下作为举例了。
关于该模式如果涉及到线程还有很多控制的细节,不过那都是结合其他知识对该模式的运用,就模式而言,这篇应该够了。
如果对其他的感兴趣,如下是一篇不错的文章。
JAVA设计模式之单例模式(单件模式)—Singleton Pattern - CarryJack - 博客园
补充C#单件实现
类图
代码
using System;
namespace 单实例模式
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Program p = new Program();
p.main();
Console.ReadLine();
}
private void main() {
Singleton singleton_a = Singleton.Instance();
Singleton singleton_b = Singleton.Instance();
Console.WriteLine("设置 singleton_b 的SigeltonData为:5");
singleton_b.SingletonOperation(5);
Console.WriteLine("设置后 singleton_a 的SigeltonData为:" + singleton_a.GetSigeltonData());
}
}
class Singleton
{
private static Singleton uniqueInstance = new Singleton();
private int singletonData = 0;
public int GetSigeltonData()
{
return singletonData;
}
// 实例化
public static Singleton Instance()
{
return uniqueInstance;
}
// 单件的动作
public void SingletonOperation(int data)
{
singletonData = data;
}
}
}
运行结果