博客 / 詳情

返回

中介者模式

中介者維護一組用户的交互,用户之間通過中介者進行交互,而不是直接交互。

中介者模式種一般有以下角色

  • 抽象中介者:定義中介者需要的執行方法。
  • 具體中介者:實現用户交互的具體邏輯。
  • 用户類:引入中介者,向中介者輸出需要交互的內容。

下面通過一個婚介中心的實例來實現中介者模式

抽象中介者 - 婚介中心

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
你是我的心你是我的肝你是我的四分之三!

優點

  • 降低了類的複雜度,將原本用户之間的一對多,變成了用户和中介之間的一對一
  • 將用户之間解耦

缺點

  • 中介者會非常龐大,難以維護
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.