2023-04-01  阅读(45)
原文作者:LoveLion 原文地址:https://blog.csdn.net/lovelion/article/details/8522982

4 共享状态

在有些情况下,多个环境对象可能需要共享同一个状态,如果希望在系统中实现多个环境对象共享一个或多个状态对象,那么需要 将这些状态对象定义为环境类的静态成员对象

下面通过一个简单实例来说明如何实现共享状态:

如果某系统要求两个开关对象要么都处于开的状态,要么都处于关的状态,在使用时它们的状态必须保持一致,开关可以由开转换到关,也可以由关转换到开。

可以使用状态模式来实现开关的设计,其结构如图5所示:

202304012108588881.png

图5 开关及其状态设计结构图

开关类Switch代码如下所示:

    class Switch {
    	private static State state,onState,offState; //定义三个静态的状态对象
    	private String name;
    	
    	public Switch(String name) {
    		this.name = name;
    		onState = new OnState();
    		offState = new OffState();
    		this.state = onState;
    	}
    
    	public void setState(State state) {
    		this.state = state;
    	}
    
    	public static State getState(String type) {
    		if (type.equalsIgnoreCase("on")) {
    			return onState;
    		}
    		else {
    			return offState;
    		}
    	}
    		
        //打开开关
    	public void on() {
    		System.out.print(name);
    		state.on(this);
    	}
    	
    //关闭开关
    	public void off() {
    		System.out.print(name);
    		state.off(this);
    	}
    }

抽象状态类如下代码所示:

    abstract class State {
    	public abstract void on(Switch s);
    	public abstract void off(Switch s);
    }

两个具体状态类如下代码所示:

    //打开状态
    class OnState extends State {
    	public void on(Switch s) {
    		System.out.println("已经打开!");
    	}
    	
    	public void off(Switch s) {
    		System.out.println("关闭!");
    		s.setState(Switch.getState("off"));
    	}
    }
    
    //关闭状态
    class OffState extends State {
    	public void on(Switch s) {
    		System.out.println("打开!");
    		s.setState(Switch.getState("on"));
    	}
    	
    	public void off(Switch s) {
    		System.out.println("已经关闭!");
    	}
    }

编写如下客户端代码进行测试:

    class Client {
    	public static void main(String args[]) {
    		Switch s1,s2;
    		s1=new Switch("开关1");
    		s2=new Switch("开关2");
    		
    		s1.on();
    		s2.on();
    		s1.off();
    		s2.off();
    		s2.on();
    		s1.on();	
    	}
    }

输出结果如下:

开关1已经打开!

开关2已经打开!

开关1关闭!

开关2已经关闭!

开关2打开!

开关1已经打开!

从输出结果可以得知两个开关共享相同的状态,如果第一个开关关闭,则第二个开关也将关闭,再次关闭时将输出“已经关闭”;打开时也将得到类似结果。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文