zoukankan      html  css  js  c++  java
  • 设计模式(第十八式:中介者模式)

    概念:
      中介者模式:Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. 定义一个对象封装一些对象的交互。中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变与他们之间的交互。

    实现:
      定义中介者接口

        public interface MarriageAgency {
    
            void pair(AbstractPerson person);
    
            void register(AbstractPerson person);
    
        }


      抽象实体类
       

    public abstract class AbstractPerson {
            private String name;
            private Integer age;
            private Sex sex;
    
            private Integer requestAge;
    
            private MarriageAgency agency;
    
            public AbstractPerson(String name, Integer age, Sex sex, Integer requestAge, MarriageAgency agency) {
                this.name = name;
                this.age = age;
                this.sex = sex;
                this.requestAge = requestAge;
                this.agency = agency;
    
                agency.register(this);
            }
    
            public void findPartner() {
                agency.pair(this);
            }
            //add getter and setter...
        }


      中介者实现

        public class MarriageAgencyImpl implements MarriageAgency {
            private List<Man> manList = new ArrayList<>();
            private List<Woman> womenList = new ArrayList<>();
    
            @Override
            public void pair(AbstractPerson person) {
                if (person.getSex().equals(Sex.MALE)) {
                    match(womenList, person);
                } else if (person.getSex() == Sex.FEMALE) {
                    match(manList, person);
                }
            }
    
            private <T extends AbstractPerson> void match(List<T> list, AbstractPerson person) {
    
                for (AbstractPerson item : list) {
                    if (person.getRequestAge().equals(item.getAge())) {
                        System.out.println(person.getName() + "和" + item.getName() + "匹配成功");
                        return;
                    }
                }
    
                /*
                 * 这里如果使用lambda表达式,return不能结束该方法返回,只能结束lambda表达式所在的forEach循环
                 */
        //        list.forEach(item->{
        //            if(person.getRequestAge().equals(item.getAge())){
        //                System.out.println(person.getName()+"和"+item.getName()+"匹配成功");
        //                return;
        //            }
        //        });
    
                System.out.println(person.getName() + "没有匹配到");
            }
    
            @Override
            public void register(AbstractPerson person) {
                if (person.getSex() == Sex.MALE) {
                    manList.add((Man) person);
                } else if (person.getSex().equals(Sex.FEMALE)) {
                    womenList.add((Woman) person);
                }
    
            }
        }


        具体类实现

        public class Man extends AbstractPerson {
            public Man(String name, Integer age, Sex sex, Integer requestAge, MarriageAgency agency) {
                super(name, age, sex, requestAge, agency);
            }
        }
        public class Woman extends AbstractPerson {
            public Woman(String name, Integer age, Sex sex, Integer requestAge, MarriageAgency agency) {
                super(name, age, sex, requestAge, agency);
            }
        }
        public enum Sex {
            MALE,FEMALE
        }


    测试及结果:

        @Test
        public void mediatorTest(){
    
            MarriageAgency agency = new MarriageAgencyImpl();
            AbstractPerson person1 = new Man("张一",24, Sex.MALE,22,agency);
            AbstractPerson person2 = new Woman("张二",23, Sex.FEMALE,22,agency);
            AbstractPerson person3 = new Woman("张三",22, Sex.FEMALE,22,agency);
            AbstractPerson person4 = new Woman("张四",21, Sex.FEMALE,22,agency);
    
            person1.findPartner();
            person2.findPartner();
            person3.findPartner();
            person4.findPartner();
    
        }


      张一和张三匹配成功
      张二没有匹配到
      张三没有匹配到
      张四没有匹配到

    分析:
      1.虽然增加了中介者,但降低了具体实现类的复杂度,整体来说是有利与代码的维护。
      2.中介者模式容易被误用或者滥用,因为各中介者的处理逻辑不相同,导致代码不能有效复用。
      3.中介者模式存在的意义在于简化依赖关系,通常能将一对多依赖转换成一对一依赖。

  • 相关阅读:
    【sql:练习题3】查询在 SC 表存在成绩的学生信息
    【sql:练习题2】查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
    学习设计模式之动态代理
    学习设计模式之静态代理
    学习设计模式之装饰器模式
    学习设计模式之策略模式
    学习设计模式之简单工厂
    Ehcache3.x学习(二)分层的选项
    Ehcache3.x学习(一)入门
    java进行微信h5支付开发
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11133824.html
Copyright © 2011-2022 走看看