• 状态者模式


    下面是设计的UML类图:

    类总括:

     

    复制代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace Club
      8 {
      9     class Program
     10     {
     11         static void Main(string[] args)
     12         {
     13             Account account = new Account("Legend", 270);
     14             Console.WriteLine("Successed!");
     15             Console.WriteLine("Name:{0}", account.Owner);
     16             Console.WriteLine("Initial:{0}", account.Balance);
     17             Console.WriteLine("------------------");
     18 
     19             account.Cost(250);
     20             Console.WriteLine("-----------------------------------------");
     21 
     22             account.Deposit(100);
     23             Console.WriteLine("-------------------");
     24 
     25             account.Deposit(200);
     26             Console.WriteLine("-----------------------------------------");
     27 
     28             account.Cost(300);
     29             Console.WriteLine("--------------------");
     30 
     31             account.Deposit(999);
     32             Console.WriteLine("-----------------------------------------");
     33 
     34             account.Cost(700);
     35             Console.WriteLine("---------------------");
     36 
     37             account.Cost(123);
     38             Console.WriteLine("-----------------------------------------");
     39 
     40             Console.ReadLine();
     41         }
     42     }
     43 }
     44 class Account
     45 {
     46     public ClientState State{get;set;}
     47     public string Owner{get;set;}
     48     public double Balance{get;set;}
     49 
     50     public Account(string owner,double initialAmount)
     51     {
     52         Owner=owner;
     53         Balance=initialAmount;
     54         State=new VistorState(this);
     55     }
     56 
     57     public void SetBalance(double amount)
     58     {
     59         Balance=amount;
     60     }
     61 
     62     public void Deposit(double amount)
     63     {
     64         Console.WriteLine("Now,deposit {0}.", amount);
     65         State.Deposit(amount);
     66         Console.WriteLine("ClientState turn to {0}", State);
     67     }
     68 
     69     public void Cost(double amount)
     70     {
     71         Console.WriteLine("Now,Cost {0}.", amount);
     72         State.Cost(amount);
     73         Console.WriteLine("ClientState turn to {0}", State);
     74     }
     75 }
     76 abstract class ClientState
     77 {
     78     protected Account Account;
     79     public abstract void Deposit(double amount);
     80     public abstract void Cost(double amount);
     81     public abstract void Check();
     82 }
     83 class VistorState : ClientState
     84 {
     85     public VistorState(Account account)
     86     {
     87         Account=account;
     88     }
     89 
     90     public override void Deposit(double amount)
     91     {
     92          Account.Balance+=amount;
     93         Console.WriteLine("Deposit {0} to {1},surplus of account have {2} affter deposit", amount, Account.Owner, Account.Balance);
     94         Check();
     95     }
     96 
     97     public override void Cost(double amount)
     98     {
     99          double newBalance=Account.Balance-amount;
    100         Account.Balance-=amount;
    101         Console.WriteLine("Cost {0} from {1},surplus of account have {2} affter cost", amount, Account.Owner, Account.Balance);
    102         Check();
    103     }
    104     public override void Check()
    105     {
    106          if(Account.Balance>100 && Account.Balance<1000)
    107         {
    108             Account.State=new MemberState(Account);
    109         }
    110         else if(Account.Balance>=1000)
    111         {
    112              Account.State=new VIPState(Account);
    113         }
    114     }
    115 }
    116 class MemberState : ClientState
    117 {
    118     public MemberState(Account account)
    119     {
    120         Account=account;
    121     }
    122 
    123     public override void Deposit(double amount)
    124     {
    125          Account.Balance+=amount;
    126         Console.WriteLine("Deposit {0} to {1},surplus of account have {2} affter deposit", amount, Account.Owner, Account.Balance);
    127         Check();
    128     }
    129 
    130     public override void Cost(double amount)
    131     {
    132          double newBalance=Account.Balance-amount;
    133         Account.Balance-=amount;
    134         Console.WriteLine("Cost {0} from {1},surplus of account have {2} affter cost", amount, Account.Owner, Account.Balance);
    135         Check();
    136     }
    137     public override void Check()
    138     {
    139          if(Account.Balance>0 && Account.Balance<=100)
    140         {
    141             Account.State = new VistorState(Account);
    142         }
    143         else if(Account.Balance>=1000)
    144         {
    145              Account.State=new VIPState(Account);
    146         }
    147     }
    148 }
    149 class VIPState : ClientState
    150 {
    151     public VIPState(Account account)
    152     {
    153         Account=account;
    154     }
    155 
    156     public override void Deposit(double amount)
    157     {
    158          Account.Balance+=amount;
    159         Console.WriteLine("Deposit {0} to {1},surplus of account have {2} affter deposit", amount, Account.Owner, Account.Balance);
    160         Check();
    161     }
    162 
    163     public override void Cost(double amount)
    164     {
    165          double newBalance=Account.Balance-amount;
    166         Account.Balance-=amount;
    167         Console.WriteLine("Cost {0} from {1},surplus of account have {2} affter cost", amount, Account.Owner, Account.Balance);
    168         Check();
    169     }
    170     public override void Check()
    171     {
    172          if(Account.Balance>100 && Account.Balance<1000)
    173         {
    174             Account.State=new MemberState(Account);
    175         }
    176         else if (Account.Balance > 0 && Account.Balance <=100)
    177         {
    178             Account.State = new VistorState(Account);
    179         }
    180     }
    181 }
    复制代码

    运行结果:

     

    优点:

      1.封装了转换规则;

      2. 方便增加 新的状态;

      3. 允许状态转换逻辑与状态对象合成一体;

      4. 环境对象可共享状态对象。

    缺点:

      1.结构及实现复杂;

      2.代码更显得累赘;

      3.不太支持OCP。

  • 相关阅读:
    Preserving Remote IP/Host while proxying
    使用EF Core生成实体类 用来作为NetCore数据库访问上下文 Context
    【ASP.NET Core快速入门】(八)Middleware管道介绍、自己动手构建RequestDelegate管道
    NetCore WebApi 基于Jwt的验证授权方式
    Net Core 页面的生命周期 + OnActionExecuting
    C# 多线程发送邮件 代码版
    ASP.NET Core 中的过滤器(Action过滤器,控制器过滤器,全局应用程序过滤器)
    深入理解 NetCore 中的依赖注入的好处 及 、Singleton、Scoped、Transient 三种对象的差异
    巧用 display: contents 增强页面语义
    巧妙实现带圆角的渐变边框
  • 原文地址:https://www.cnblogs.com/leaderchen/p/5093236.html
Copyright © 2020-2023  润新知