设计模式之中介模式

来源:互联网 发布:东芝复印机网络店 编辑:程序博客网 时间:2024/06/10 13:04
模式定义:
        用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显式地
        引用其他对象实例,从而降低对象之间的耦合度,并且可以独立地改变对象
        之间的交互关系。中介拥有各个对象的引用,对象与对象通信通过中介的转达。
遵循原则:
        集中控制,提高类的复用性;
        将一对多的复杂关系转换成一对一的简单关系。
使用场合:
        (1)一组定义良好的对象,现在要进行复杂的通信。

        (2)定制一个分布在多个类中的行为,而又不想生成太多的子类。
知识扩展:

        JDK中的ButtonGroup即是中介者模式,另外QQ的聊天室亦是。


public interface IMediator {
    public void rigester(IUser user);
    public void notifyMessage(IUser from);
}

public class ConcreteMediator implements IMediator {

    private final List<IUser> list = new ArrayList<IUser>();
    @Override
    public void notifyMessage(IUser from) {
        Iterator<IUser> itr = list.iterator();
        IUser tempUser = null;
        while (itr.hasNext()) {
            tempUser =  itr.next();
            if(tempUser!=null && !tempUser.equals(from)){
                tempUser.receiveMessage(from.getMessage());
            }
        }
    }

    @Override
    public void rigester(IUser user) {
        if(user!=null && !list.contains(user)){
            list.add(user);
        }
    }

}

public interface IUser {
    public void receiveMessage(String message);
    public void sendMessage(String message);
    public String getMessage();
}

public abstract class AbstractUser implements IUser {

    protected IMediator mediator;
    protected String name;
    protected String message;
    
    public AbstractUser(IMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    @Override
    public String getMessage() {
        // TODO Auto-generated method stub
        return this.message;
    }

    @Override
    public void sendMessage(String message) {
        this.message = message;
        System.out.println(this.name+"说:"+message);
        mediator.notifyMessage(this);
    }

}

public class UserAAA extends AbstractUser {

    public UserAAA(IMediator mediator, String name) {
        super(mediator, name);
        mediator.rigester(this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("用户AAA接收到消息:"+message);

    }

}

public class UserBBB extends AbstractUser {

    public UserBBB(IMediator mediator, String name) {
        super(mediator, name);
        mediator.rigester(this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("用户BBB接收到消息:"+message);

    }

}

public class UserCCC extends AbstractUser {

    public UserCCC(IMediator mediator, String name) {
        super(mediator, name);
        mediator.rigester(this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("用户CCC接收到消息:"+message);

    }

}
测试
public class Client {
    public static void main(String[] args) {
        IMediator mediator = new ConcreteMediator();
        IUser userA = new UserAAA(mediator, "用户AAA");
        IUser userB = new UserBBB(mediator, "用户BBB");
        IUser userC = new UserCCC(mediator, "用户CCC");
        System.out.println("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");
        userA.sendMessage("大家好,我是张三,请多多关照");
        System.out.println("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");
        userB.sendMessage("你好,我是李四,欢迎你");
        System.out.println("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");
        userC.sendMessage("嘿,你们都在干嘛呢");
    }

}

0 0