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

20.3 完整解决方案

为了协调界面组件对象之间的复杂交互关系,Sunny公司开发人员使用中介者模式来设计客户信息管理窗口,其结构示意图如图20-7所示:

202304012107163101.png

图20-7 引入了中介者类的“客户信息管理窗口”结构示意图

图20-7只是一个重构之后的结构示意图,在具体实现时,为了确保系统具有更好的灵活性和可扩展性,我们需要定义抽象中介者和抽象组件类,其中抽象组件类是所有具体组件类的公共父类,完整类图如图20-8所示:

202304012107171262.png

图20-8 重构后的“客户信息管理窗口”结构图

在图20-8中,Component充当抽象同事类,Button、List、ComboBox和TextBox充当具体同事类,Mediator充当抽象中介者类,ConcreteMediator充当具体中介者类,ConcreteMediator维持了对具体同事类的引用,为了简化ConcreteMediator类的代码,我们在其中只定义了一个Button对象和一个TextBox对象。完整代码如下所示:

    //抽象中介者
    abstract class Mediator {
    	public abstract void componentChanged(Component c);
    }
    
    //具体中介者
    class ConcreteMediator extends Mediator {
    	//维持对各个同事对象的引用
    	public Button addButton;
    	public List list;
    	public TextBox userNameTextBox;
    	public ComboBox cb;
    
        //封装同事对象之间的交互
    	public void componentChanged(Component c) {
    		//单击按钮
    if(c == addButton) {
    			System.out.println("--单击增加按钮--");
    			list.update();
    			cb.update();
    			userNameTextBox.update();
    		}
            //从列表框选择客户
    		else if(c == list) {
    			System.out.println("--从列表框选择客户--");
    			cb.select();
    			userNameTextBox.setText();
    		}
            //从组合框选择客户
    		else if(c == cb) {
    			System.out.println("--从组合框选择客户--");
    			cb.select();
    			userNameTextBox.setText();
    		}
    	}
    }
    
    //抽象组件类:抽象同事类
    abstract class Component {
    	protected Mediator mediator;
    	
    	public void setMediator(Mediator mediator) {
    		this.mediator = mediator;
    	}
    
    	//转发调用
    	public void changed() {
    		mediator.componentChanged(this);
    	}
    	
    	public abstract void update();	
    }
    
    //按钮类:具体同事类
    class Button extends Component {
    	public void update() {
    		//按钮不产生交互
    	}
    }
    
    //列表框类:具体同事类
    class List extends Component {
    	public void update() {
    		System.out.println("列表框增加一项:张无忌。");
    	}
    	
    	public void select() {
    		System.out.println("列表框选中项:小龙女。");
    	}
    }
    
    //组合框类:具体同事类
    class ComboBox extends Component {
    	public void update() {
    		System.out.println("组合框增加一项:张无忌。");
    	}
    	
    	public void select() {
    		System.out.println("组合框选中项:小龙女。");
    	}
    }
    
    //文本框类:具体同事类
    class TextBox extends Component {
    	public void update() {
    		System.out.println("客户信息增加成功后文本框清空。");
    	}
    	
    	public void setText() {
    		System.out.println("文本框显示:小龙女。");
    	}
    }

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

    class Client {
    	public static void main(String args[]) {
            //定义中介者对象
    		ConcreteMediator mediator;
    		mediator = new ConcreteMediator();
    		
            //定义同事对象
    		Button addBT = new Button();
    		List list = new List();
    	    ComboBox cb = new ComboBox();
    	    TextBox userNameTB = new TextBox();
    
    		addBT.setMediator(mediator);
    		list.setMediator(mediator);
    		cb.setMediator(mediator);
    		userNameTB.setMediator(mediator);
    
    		mediator.addButton = addBT;
    		mediator.list = list;
    		mediator.cb = cb;
    		mediator.userNameTextBox = userNameTB;
    		
    		addBT.changed();
    		System.out.println("-----------------------------");
    		list.changed();
    	}
    }

编译并运行程序,输出结果如下:

--单击增加按钮--

列表框增加一项:张无忌。

组合框增加一项:张无忌。

客户信息增加成功后文本框清空。

-----------------------------

--从列表框选择客户--

组合框选中项:小龙女。

文本框显示:小龙女。


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] ,回复【面试题】 即可免费领取。

阅读全文