状态模式
正文:https://refactoringguru.cn/design-patterns/state
Fortran代码:https://my.oschina.net/zuozhihua/blog/5150176
module state_module
implicit none
private
public :: person_type
type :: hungry_state_type
logical :: state
contains
procedure :: hungry => hungry_state_t_hungry
procedure :: no_hungry => hungry_state_t_no_hungry
end type hungry_state_type
type :: person_type
type(hungry_state_type) :: hungry_state
contains
procedure :: eat => person_t_eat
procedure :: work => person_t_work
end type
contains
subroutine person_t_eat(self)
class(person_type), intent(inout) :: self
if (self%hungry_state%state) then
print *, "Eatting.."
!!// 改变状态
call self%hungry_state%no_hungry
else
print *, "Already baole!!"
end if
end subroutine person_t_eat
subroutine person_t_work(self)
class(person_type), intent(inout) :: self
if (self%hungry_state%state) then
print *, "I am hungry, no work!!"
else
print *, "Ok, let us do work.."
call self%hungry_state%hungry
end if
end subroutine person_t_work
subroutine hungry_state_t_hungry(self)
class(hungry_state_type), intent(inout) :: self
self%state = .true.
end subroutine hungry_state_t_hungry
subroutine hungry_state_t_no_hungry(self)
class(hungry_state_type), intent(inout) :: self
self%state = .false.
end subroutine hungry_state_t_no_hungry
end module state_module
program state_main
use state_module, only: person_type
implicit none
type(person_type) :: person
call person%hungry_state%no_hungry
call person%work
call person%work
call person%eat
call person%eat
end program state_main
!> Results shall be:
! Ok, let us do work..
! I am hungry, no work!!
! Eatting..
! Already baole!!