【设计模式】--MONOSTATE模式

来源:互联网 发布:会计在职研究生 网络 编辑:程序博客网 时间:2024/06/07 05:53

1 gingleton 单例模式 -->饿汉模式 实现创建实例 懒汉模式是使用时创建,关注行为

2  monostate 模式 关注结构;

3  示例

class Monostate{    private static int itsX = 0;    public Monostate(){    }    public static int getItsX() {        return itsX;    }    public static void setItsX(int itsX) {        Monostate.itsX = itsX;    }}

4 好处:1  透明性 (和普通对象没有区别)2 可派生(共享相同的变量)3 多态性(覆盖方法)

   代价:1 不可转换性(regular-->monostate) 2 效率问题 (对象的创建和销毁)3 内存占用 4 平台局限性(不能跨多个jvm或者多个工作平台)



5 使用示例 地铁十字门投币使用状态机

public class Turnstile {    private static boolean isLocked = true;    private static boolean isAlarming = false;    private static int itsCoins = 0;    private static int itsRefunds = 0;    protected final static Turnstile LOCKED = new Locked();    protected final static Turnstile UNLOCKED = new Unlocked();    protected static Turnstile itsState = LOCKED;    public void reset() {        lock(true);        alarm(false);        itsCoins = 0;        itsRefunds = 0;        itsState = LOCKED;    }    public boolean locked() {        return isLocked;    }    public boolean alarm() {        return isAlarming;    }    //状态子类覆盖    public void coin() {        itsState.coin();    }    //状态子类覆盖    public void pass() {        itsState.pass();    }    protected void lock(boolean shouldLock) {        isLocked = shouldLock;    }    protected void alarm(boolean shouldAlarm) {        isAlarming = shouldAlarm;    }    public int coins() {        return itsCoins;    }    public int refunds() {        return itsRefunds;    }    public void deposit() {        itsCoins++;    }    public void refund() {        itsRefunds++;    }    /**     * 代表Locked状态机     */    static class Locked extends Turnstile {        //投币操作        @Override        public void coin() {            itsState = UNLOCKED;            lock(false);            alarm(false);            deposit();        }        //锁定状态通过 会报警        @Override        public void pass() {            System.out.println("非法入侵");            alarm(true);        }    }    static class Unlocked extends Turnstile{        //非锁定状态投币会退回硬币        @Override        public void coin(){            refund();        }        @Override        public void pass(){            lock(true);            itsState = LOCKED;        }    }    public static void main(String[] args) {        Turnstile turnstile = new Turnstile();        turnstile.coin();//投币        Turnstile turnstile1 = new Turnstile();        turnstile1.pass();//通过        turnstile1.pass();//报警    }}