zoukankan      html  css  js  c++  java
  • 设计模式(十五)------23种设计模式(7):中介者模式

    使用频率:★★★☆☆

    一、什么是中介者模式

    对象之间通过中介者对象进行交互,而不是直接交互;

    二、补充说明

    对紧密关联的各个对象解耦;

    典型例子:QQ群,聊天室;

    三、角色

    抽象中介者

    具体中介者

    抽象对象

    具体对象

    四、例子,JAVA实现

    例子说明,一个网络聊天室

    抽象中介者

    复制代码
    package com.pichen.dp.behavioralpattern.mediator;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class Mediator {
    
        protected List<User> userList;
        public Mediator() {
            userList = new ArrayList<User>();
        }
        public void addUser(User user){
            user.setMediator(this);
            this.userList.add(user);
        }
        
        public abstract void operation(User user, String msg);
    }
    复制代码

    具体中介者

    复制代码
    package com.pichen.dp.behavioralpattern.mediator;
    public class ChatRoomMediator extends Mediator {
    
        @Override
        public void operation(User user, String msg) {
            System.out.println(user.getName() + "send a msg : " + msg);
            for(User userTmp : this.userList){
                userTmp.getMessage(msg);
            }
        }
    }
    复制代码

    抽象对象

    复制代码
    package com.pichen.dp.behavioralpattern.mediator;
    
    public abstract class User {
        protected Mediator mediator;
        
        protected String name;
        
        public User(String name) {
            this.name = name;
        }
        
        protected void setMediator(Mediator mediator){
            this.mediator = mediator;
        }
        protected abstract void sendMessage(String msg);
    
        protected abstract void getMessage(String msg);
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    复制代码

    具体对象

    复制代码
    package com.pichen.dp.behavioralpattern.mediator;
    public class CommonUser extends User{
    
        public CommonUser(String name) {
            super(name);
        }
        @Override
        protected void sendMessage(String msg) {
            this.mediator.operation(this, msg);
        }
    
        @Override
        protected void getMessage(String msg) {
            System.out.println(this.getName() +  " get msg:"+msg);
        }
    
        
    }
    复制代码
    复制代码
    package com.pichen.dp.behavioralpattern.mediator;
    public class VIPUser extends User{
        public VIPUser(String name) {
            super(name);
        }
    
        @Override
        protected void sendMessage(String msg) {
            this.mediator.operation(this, msg);
        }
    
        @Override
        protected void getMessage(String msg) {
            System.out.println(this.getName() + " get msg:"+msg);
        }
    
    }
    复制代码

    客户端

    复制代码
    package com.pichen.dp.behavioralpattern.mediator;
    public class Main {
    
        public static void main(String[] args) {
            CommonUser user1 = new CommonUser("小王");
            CommonUser user2 = new CommonUser("小陈");
            VIPUser vipUser = new VIPUser("小张");
            
            Mediator chatRoom = new ChatRoomMediator();
            chatRoom.addUser(user1);
            chatRoom.addUser(user2);
            chatRoom.addUser(vipUser);
    
            user2.sendMessage("hello everybody~");
            
        }
    }
    复制代码

    执行结果

    小陈send a msg : hello everybody~
    小王 get msg:hello everybody~
    小陈 get msg:hello everybody~
    小张 get msg:hello everybody~

    @Author      风一样的码农
    @HomePageUrl http://www.cnblogs.com/chenpi/ 
    @Copyright      转载请注明出处,谢谢~ 

  • 相关阅读:
    Problem C: 时间类的常量
    Problem B: 时间类的错误数据处理
    Problem A: 时间类的拷贝和整体读写
    Problem B: 平面上的点——Point类 (IV)
    Problem C: 平面上的点——Point类 (V)
    Problem A: 平面上的点——Point类 (III)
    中间的数(若已经排好序)
    软件工程概论团队结组
    软件工程个人作业04 子数组循环数组
    软件工程个人作业03
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9380972.html
Copyright © 2011-2022 走看看