中介者保护一组用户的交互,用户之间通过中介者进行交互,而不是间接交互。
中介者模式种个别有以下角色
- 形象中介者:定义中介者须要的执行办法。
具体中介者:实现用户交互的具体逻辑。
用户类:引入中介者,向中介者输入须要交互的内容。
上面通过一个婚介核心的实例来实现中介者模式
形象中介者 - 婚介核心
public interface DatingAgency { /* ** 退出会员* @param dog* / void join(SingleDog dog); /* ** 依据年龄范畴选会员* @param min* @param max* @return* / List<SingleDog> getList(Integer min, Integer max, SingleDog.SexEnum sexEnum);}
具体中介者 - 王婆婚介所
public class WangPoDatingAgency implements DatingAgency{ private List<SingleDog> singleDogs = new ArrayList<>(); @Override public void join(SingleDog dog) { System.out.println("欢送"+dog.getName()+"退出王婆婚介所"); singleDogs.add(dog); } @Override public List<SingleDog> getList(Integer min, Integer max, SingleDog.SexEnum sexEnum) { return singleDogs.stream().filter(dog -> { if (dog.getAge() >= min && dog.getAge() <= max && !sexEnum.equals(dog.getSex())) return true; return false; }).collect(Collectors.toList()); }}
形象用户 - 独身人员
public abstract class SingleDog { DatingAgency agency; private String name; private Integer age; private SexEnum sex; public enum SexEnum{ MAN("男"),WOMAN("女"); private String sex; SexEnum(String sex) { this.sex = sex; } } public SingleDog(DatingAgency agency, String name, Integer age, SexEnum sex) { this.agency = agency; this.name = name; this.age = age; this.sex = sex; agency.join(this); } /* ** 依据年龄筛选同性* @return* / public abstract List<SingleDog> pickByAge(Integer min,Integer max); public abstract void introduce(); public DatingAgency getAgency() { return agency; } public void setAgency(DatingAgency agency) { this.agency = agency; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public SexEnum getSex() { return sex; }}
具体用户 - 程序员用户
public class Programmer extends SingleDog{ public Programmer(DatingAgency agency, String name, Integer age, SexEnum sex) { super(agency, name, age, sex); } @Override public List<SingleDog> pickByAge(Integer min, Integer max) { return agency.getList(min,max,getSex()); } @Override public void introduce() { System.out.println("读以下代码能够获取我的QQ号"); System.out.println("0110 1001 0101 0001 0010 0011 0100 ......"); }}
具体用户 - 恋爱经验丰富的独身人员
public class ExperienceSingleDog extends SingleDog{ public ExperienceSingleDog(DatingAgency agency, String name, Integer age, SexEnum sex) { super(agency, name, age, sex); } @Override public List<SingleDog> pickByAge(Integer min, Integer max) { return agency.getList(min,max,getSex()); } @Override public void introduce() { System.out.println("你是我的心你是我的肝你是我的四分之三!"); }}
测试
public class MediatorTest { @Test public void test(){ DatingAgency agency = new WangPoDatingAgency(); SingleDog dog1 = new Programmer(agency,"程序员A",23, SingleDog.SexEnum.MAN); SingleDog dog2 = new Programmer(agency,"程序员B",29, SingleDog.SexEnum.MAN); SingleDog dog3 = new Programmer(agency,"程序员C",35, SingleDog.SexEnum.WOMAN); SingleDog dog4 = new ExperienceSingleDog(agency,"渣男A",24, SingleDog.SexEnum.MAN); SingleDog dog5 = new ExperienceSingleDog(agency,"渣女A",31, SingleDog.SexEnum.WOMAN); List<SingleDog> singleDogs = dog5.pickByAge(24, 35); for (SingleDog dog:singleDogs) { System.out.println("===================="); System.out.println("名字"+dog.getName()); System.out.println("年龄"+dog.getAge()); dog.introduce(); } }}======后果======欢送程序员A退出王婆婚介所欢送程序员B退出王婆婚介所欢送程序员C退出王婆婚介所欢送渣男A退出王婆婚介所欢送渣女A退出王婆婚介所====================名字程序员B年龄29读以下代码能够获取我的QQ号0110 1001 0101 0001 0010 0011 0100 ......====================名字渣男A年龄24你是我的心你是我的肝你是我的四分之三!
长处
升高了类的复杂度,将本来用户之间的一对多,变成了用户和中介之间的一对一
将用户之间解耦
毛病
中介者会十分宏大,难以保护