行为型模式:18-中介者模式

2021-06-17  本文已影响0人  综合楼

中介者模式(Mediator Pattern):
用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式又称为调停者模式,它是一种对象行为型模式。

image.png

在中介者模式结构图中包含如下几个角色:

● Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。

● ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现
协作行为,它维持了对各个同事对象的引用。

● Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类
实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。

● ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他
同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同
事类中实现了在抽象同事类中声明的抽象方法。

QQ群

image.png
public abstract class Member {
    protected AbstractChatroom chatroom;
    protected String name;

    public Member(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public AbstractChatroom getChatroom() {
        return chatroom;
    }

    public void setChatroom(AbstractChatroom chatroom) {
        this.chatroom = chatroom;
    }

    public abstract void sendText(String to, String message);

    public abstract void sendImage(String to, String image);

    public void receiveText(String from, String message) {
        System.out.println(from + "发送文本给" + this.name + ",内容为:" + message);
    }

    public void receiveImage(String from, String image) {
        System.out.println(from + "发送图片给" + this.name + ",内容为:" + image);
    }
}
-------------------------------------------------------------------------------------------------------------
public class CommonMember extends Member {
    public CommonMember(String name) {
        super(name);
    }

    public void sendText(String to, String message) {
        System.out.println("普通会员发送信息:");
        chatroom.sendText(name, to, message);  //发送
    }

    public void sendImage(String to, String image) {
        System.out.println("普通会员不能发送图片!");
    }
}
-------------------------------------------------------------------------------------------------------------
public class DiamondMember extends Member {
    public DiamondMember(String name) {
        super(name);
    }

    public void sendText(String to, String message) {
        System.out.println("钻石会员发送信息:");
        chatroom.sendText(name, to, message);  //发送
    }

    public void sendImage(String to, String image) {
        System.out.println("钻石会员发送图片:");
        chatroom.sendImage(name, to, image);  //发送
    }
}
public abstract class AbstractChatroom {
    public abstract void register(Member member);

    public abstract void sendText(String from, String to, String message);

    public abstract void sendImage(String from, String to, String message);
}
-------------------------------------------------------------------------------------------------------------
import java.util.Hashtable;

public class ChatGroup extends AbstractChatroom {
    private Hashtable members = new Hashtable();

    public void register(Member member) {
        if (!members.contains(member)) {
            members.put(member.getName(), member);
            member.setChatroom(this);
        }
    }

    public void sendText(String from, String to, String message) {
        Member member = (Member) members.get(to);
        String newMessage = message;
        newMessage = message.replaceAll("日", "*");
        member.receiveText(from, newMessage);
    }

    public void sendImage(String from, String to, String image) {
        Member member = (Member) members.get(to);
        //模拟图片大小判断
        if (image.length() > 5) {
            System.out.println("图片太大,发送失败!");
        } else {
            member.receiveImage(from, image);
        }
    }
}
public class Client {
    public static void main(String args[]) {
        AbstractChatroom happyChat = new ChatGroup();
        Member member1, member2, member3, member4, member5;
        member1 = new DiamondMember("张三");
        member2 = new DiamondMember("李四");
        member3 = new CommonMember("王五");
        member4 = new CommonMember("小芳");
        member5 = new CommonMember("小红");

        happyChat.register(member1);
        happyChat.register(member2);
        happyChat.register(member3);
        happyChat.register(member4);
        happyChat.register(member5);

        member1.sendText("李四", "李四,你好!");
        member2.sendText("张三", "张三,你好!");
        member1.sendText("李四", "今天天气不错,有日!");
        member2.sendImage("张三", "一个很大很大的太阳");
        member2.sendImage("张三", "太阳");
        member3.sendText("小芳", "还有问题吗?");
        member3.sendText("小红", "还有问题吗?");
        member4.sendText("王五", "没有了,谢谢!");
        member5.sendText("王五", "我也没有了!");
        member5.sendImage("王五", "谢谢");
    }
}
image.png

客户信息管理窗口

image.png

在图20-8中,Component充当抽象同事类,
Button、List、ComboBox和TextBox充当具体同事类,
Mediator充当抽象中介者类,
ConcreteMediator充当具体中介者类,

ConcreteMediator维持了对具体同事类的引用,为了简化ConcreteMediator类的代码,我们在其中只定义了一个Button对象和一个TextBox对象。

完整代码如下所示:

//抽象组件类:抽象同事类
abstract class Component {
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    //转发调用
    public void changed() {
        mediator.componentChanged(this);
    }

    public abstract void update();
}
-----------------------------------------------------------------------------
//组合框类:具体同事类
class ComboBox extends Component {
    public void update() {
        System.out.println("组合框增加一项:张无忌。");
    }

    public void select() {
        System.out.println("组合框选中项:小龙女。");
    }
}
-----------------------------------------------------------------------------
//按钮类:具体同事类
class Button extends Component {
    public void update() {
        //按钮不产生交互
    }
}
-----------------------------------------------------------------------------
//列表框类:具体同事类
class List extends Component {
    public void update() {
        System.out.println("列表框增加一项:张无忌。");
    }

    public void select() {
        System.out.println("列表框选中项:小龙女。");
    }
}
-----------------------------------------------------------------------------
//文本框类:具体同事类
class TextBox extends Component {
    public void update() {
        System.out.println("客户信息增加成功后文本框清空。");
    }

    public void setText() {
        System.out.println("文本框显示:小龙女。");
    }
}
//抽象中介者
abstract class Mediator {
    public abstract void componentChanged(Component c);
}
-----------------------------------------------------------------------------
//具体中介者
class ConcreteMediator extends Mediator {
    //维持对各个同事对象的引用
    public Button addButton;
    public List list;
    public TextBox userNameTextBox;
    public ComboBox cb;

    //封装同事对象之间的交互
    public void componentChanged(Component c) {
        //单击按钮
        if (c == addButton) {
            System.out.println("--单击增加按钮--");
            list.update();
            cb.update();
            userNameTextBox.update();
        }
        //从列表框选择客户
        else if (c == list) {
            System.out.println("--从列表框选择客户--");
            cb.select();
            userNameTextBox.setText();
        }
        //从组合框选择客户
        else if (c == cb) {
            System.out.println("--从组合框选择客户--");
            cb.select();
            userNameTextBox.setText();
        }
    }
}
class Client {
    public static void main(String args[]) {
        //定义中介者对象
        ConcreteMediator mediator;
        mediator = new ConcreteMediator();
        //定义同事对象
        Button addBT = new Button();
        List list = new List();
        ComboBox cb = new ComboBox();
        TextBox userNameTB = new TextBox();
        addBT.setMediator(mediator);
        list.setMediator(mediator);
        cb.setMediator(mediator);
        userNameTB.setMediator(mediator);
        mediator.addButton = addBT;
        mediator.list = list;
        mediator.cb = cb;
        mediator.userNameTextBox = userNameTB;
        addBT.changed();
        System.out.println("-----------------------------");
        list.changed();
    }
}
image.png
上一篇下一篇

猜你喜欢

热点阅读