美文网首页
行为型模式:18-中介者模式

行为型模式:18-中介者模式

作者: 综合楼 | 来源:发表于2021-06-17 20:12 被阅读0次

    中介者模式(Mediator Pattern):
    用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
    中介者模式又称为调停者模式,它是一种对象行为型模式。

    image.png

    在中介者模式结构图中包含如下几个角色:

    ● Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。

    ● ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现
    协作行为,它维持了对各个同事对象的引用。

    ● Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类
    实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。

    ● ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他
    同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同
    事类中实现了在抽象同事类中声明的抽象方法。

    QQ群

    image.png
    public abstract class Member {
        protected AbstractChatroom chatroom;
        protected String name;
    
        public Member(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public AbstractChatroom getChatroom() {
            return chatroom;
        }
    
        public void setChatroom(AbstractChatroom chatroom) {
            this.chatroom = chatroom;
        }
    
        public abstract void sendText(String to, String message);
    
        public abstract void sendImage(String to, String image);
    
        public void receiveText(String from, String message) {
            System.out.println(from + "发送文本给" + this.name + ",内容为:" + message);
        }
    
        public void receiveImage(String from, String image) {
            System.out.println(from + "发送图片给" + this.name + ",内容为:" + image);
        }
    }
    -------------------------------------------------------------------------------------------------------------
    public class CommonMember extends Member {
        public CommonMember(String name) {
            super(name);
        }
    
        public void sendText(String to, String message) {
            System.out.println("普通会员发送信息:");
            chatroom.sendText(name, to, message);  //发送
        }
    
        public void sendImage(String to, String image) {
            System.out.println("普通会员不能发送图片!");
        }
    }
    -------------------------------------------------------------------------------------------------------------
    public class DiamondMember extends Member {
        public DiamondMember(String name) {
            super(name);
        }
    
        public void sendText(String to, String message) {
            System.out.println("钻石会员发送信息:");
            chatroom.sendText(name, to, message);  //发送
        }
    
        public void sendImage(String to, String image) {
            System.out.println("钻石会员发送图片:");
            chatroom.sendImage(name, to, image);  //发送
        }
    }
    
    public abstract class AbstractChatroom {
        public abstract void register(Member member);
    
        public abstract void sendText(String from, String to, String message);
    
        public abstract void sendImage(String from, String to, String message);
    }
    -------------------------------------------------------------------------------------------------------------
    import java.util.Hashtable;
    
    public class ChatGroup extends AbstractChatroom {
        private Hashtable members = new Hashtable();
    
        public void register(Member member) {
            if (!members.contains(member)) {
                members.put(member.getName(), member);
                member.setChatroom(this);
            }
        }
    
        public void sendText(String from, String to, String message) {
            Member member = (Member) members.get(to);
            String newMessage = message;
            newMessage = message.replaceAll("日", "*");
            member.receiveText(from, newMessage);
        }
    
        public void sendImage(String from, String to, String image) {
            Member member = (Member) members.get(to);
            //模拟图片大小判断
            if (image.length() > 5) {
                System.out.println("图片太大,发送失败!");
            } else {
                member.receiveImage(from, image);
            }
        }
    }
    
    public class Client {
        public static void main(String args[]) {
            AbstractChatroom happyChat = new ChatGroup();
            Member member1, member2, member3, member4, member5;
            member1 = new DiamondMember("张三");
            member2 = new DiamondMember("李四");
            member3 = new CommonMember("王五");
            member4 = new CommonMember("小芳");
            member5 = new CommonMember("小红");
    
            happyChat.register(member1);
            happyChat.register(member2);
            happyChat.register(member3);
            happyChat.register(member4);
            happyChat.register(member5);
    
            member1.sendText("李四", "李四,你好!");
            member2.sendText("张三", "张三,你好!");
            member1.sendText("李四", "今天天气不错,有日!");
            member2.sendImage("张三", "一个很大很大的太阳");
            member2.sendImage("张三", "太阳");
            member3.sendText("小芳", "还有问题吗?");
            member3.sendText("小红", "还有问题吗?");
            member4.sendText("王五", "没有了,谢谢!");
            member5.sendText("王五", "我也没有了!");
            member5.sendImage("王五", "谢谢");
        }
    }
    
    image.png

    客户信息管理窗口

    image.png

    在图20-8中,Component充当抽象同事类,
    Button、List、ComboBox和TextBox充当具体同事类,
    Mediator充当抽象中介者类,
    ConcreteMediator充当具体中介者类,

    ConcreteMediator维持了对具体同事类的引用,为了简化ConcreteMediator类的代码,我们在其中只定义了一个Button对象和一个TextBox对象。

    完整代码如下所示:

    //抽象组件类:抽象同事类
    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 ComboBox extends Component {
        public void update() {
            System.out.println("组合框增加一项:张无忌。");
        }
    
        public void select() {
            System.out.println("组合框选中项:小龙女。");
        }
    }
    -----------------------------------------------------------------------------
    //按钮类:具体同事类
    class Button extends Component {
        public void update() {
            //按钮不产生交互
        }
    }
    -----------------------------------------------------------------------------
    //列表框类:具体同事类
    class List 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("文本框显示:小龙女。");
        }
    }
    
    //抽象中介者
    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();
            }
        }
    }
    
    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();
        }
    }
    
    image.png

    相关文章

      网友评论

          本文标题:行为型模式:18-中介者模式

          本文链接:https://www.haomeiwen.com/subject/csjieltx.html