無廢話設計模式(17)行為型模式–中介者模式

0-前言

  中介者模式定義(Mediator):

         用一個中介對象來封裝一系列的對象交互。

         中介者對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。

1-實現

1-1、簡單UML圖

 

1-2、代碼實現

//1、中介者抽象父類(客服父類)-----------------------------------------
abstract class CustomerServer
{
    abstract void Communicate(String message,Communicator communicator);
}
//1-1、具體中介者(客服MM)
class CustomerServerMM extends CustomerServer
{
    //A、設置客服服務的對象
    private Customer customer;
    private Technician technician;

    public void setCustomer(Customer _customer)
    {
        this.customer = _customer;
    }

    public void setTechnician(Technician _technician)
    {
        this.technician = _technician;
    }

    //B、客服開始溝通
    @Override
   public void Communicate(String message, Communicator communicator)
    {
        if (communicator ==customer) //顧客
        {
            technician.GetMessage(message);
        }
        else
        {
            customer.GetMessage(message);
        }
    }
}

//2、服務對象抽象父類-------------------------------------------------
abstract  class Communicator
{
    protected  CustomerServer customerServer; //中介者
    public Communicator(CustomerServer _customerServer)
    {
        this.customerServer = _customerServer;
    }
}

//2-1、服務對象具體類(顧客)
class Customer extends Communicator
{
    public Customer(CustomerServer customerServer)
    {
        super(customerServer);
    }

    //A、諮詢
    public  void Ask(String message)
    {
        customerServer.Communicate(message,this);
    }

    //B、獲得回復
    public void  GetMessage(String message)
    {
        System.out.println("顧客得到技術人員的回復:"+message);
    }
}

//2-2、服務對象具體類(維修技術人員)
class Technician extends Communicator
{
    public Technician(CustomerServer customerServer)
    {
        super(customerServer);
    }

    //A、回復
    public  void Anser(String message)
    {
        customerServer.Communicate(message,this);
    }

    //B、獲得問題
    public void  GetMessage(String message)
    {
        System.out.println("技術人員接收到顧客的問題:"+message);
    }

 

客戶端

        CustomerServerMM csMM = new CustomerServerMM();

        Customer customer = new Customer(csMM);
        Technician technician = new Technician(csMM);

        csMM.setCustomer(customer);
        csMM.setTechnician(technician);

        customer.Ask("為什麼我的電腦開不了機");
        technician.Anser("電池沒插電源沒插,開啥機!");

 

運行結果

 

 

 

2-應用場景簡單總結

1、當一組對象以定義良好但是複雜的方式進行相互通訊時;

2、當一個對象需要引用很多其他對象並與這些對象通訊時;