Java学习-设计模式-中介者模式

61 篇文章 0 订阅
48 篇文章 1 订阅

Java学习-设计模式-中介者模式

概念:

中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

**缺点:**中介者会庞大,变得复杂难以维护。

使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

理解:

就拿打牌的输赢来说,现在假设只有 A 和 B 在打牌,那么输赢都是 A、B对象类里面的余额属性发生变化,对于这个我们一般定义一个方法来实现余额的变化,现在假设多了一个 C ,那个就要在对象A、B中加上与C相关的修改余额的方法,C中要写关于 A、B的方法,如果人数一多,修改的对象类就变得很多,类也变得很臃肿。

但是,余额的变化其实都类似,只是对象不同,执行的操作的类似,所以我们把这部分操作拿出来,所有的余额操作都由这个类来操作,放到一个类中,这个类就是中介类。

查看过网上很多笔记,但是都是一个对象对一个对象的,感觉真的遇到这个场景时,不会这样写,就算不用中介者模式,我感觉应该是这样的:
1. 新建一个抽象的牌友类,包括一个余额的属性,构造方法中初始化这个属性,并提供这个属性的get和set方法,在创建一个抽象的资金改变方法,入参有一个改变的金额,还有一个类型为抽象的牌友类
2. 新建一个牌友类继承长线的牌友类,重写抽象方法,抽象方法首先修改自己的余额,然后调用入参的对象类改变其余额,完成变化。
3. 测试,新建三个牌友类,调用赢钱那个人的余额改变方法,传入对应输钱人的对象。
感觉这样也成,但是这样的话,多个对象就相互耦合了。
使用中介者模式
1. 新建一个抽象的牌友类,包括一个余额的属性,构造方法中初始化这个属性,并提供这个属性的get和set方法,在创建一个抽象的资金改变方法,入参有一个改变的金额,还有一个类型为抽象的中介类
2. 新建一个牌友类继承长线的牌友类,重写抽象方法,在方法中调用入参的中介者对象类处理
3. 新建一个中介者的抽象类,包含两个类型为抽象的牌友类 A 、B ,并在构造方法中初始化好,还包含一个抽象方法,方法中入参一个变化的余额
4. 新建一个中介者实现类实现这个抽象的中介类,重写抽象方法,根据相应关系修改对应对象的余额值
5. 测试,新建两个牌友类,初始化好两者的初始余额,使用这两个对象初始化好中介者对象,调用对应的余额变化方法改变余额。
注意:假设现在多来了一个人(即新增一个对象),不是在中介者类中添加方法,而是新建好增加的对象,将这个新增加的对象与A一起再初始化好一个中介者对象。实现B、C关系也一样。

示例:

package Practices.Mode.Mediator_Pattern;
// 1. 新建一个抽象的牌友类
public abstract class User {
    protected int money;

    public User(int money) {
        this.money = money;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public abstract void changemoney(int cmoney,AbstractMediator mediator);
}
package Practices.Mode.Mediator_Pattern;
// 2. 创建一个牌友类的实体类
public class CardUser extends User {
    public CardUser(int money) {
        super(money);
    }

    public void changemoney(int cmoney, AbstractMediator mediator) {
        mediator.WinMoney(cmoney,this);
    }
}
package Practices.Mode.Mediator_Pattern;
// 3. 新建一个抽象的中介者类
public abstract class AbstractMediator {
    protected User userA;
    protected User userB;

    public AbstractMediator(User userA, User userB) {
        this.userA = userA;
        this.userB = userB;
    }

    public abstract void WinMoney(int cmoney,User user);

}
package Practices.Mode.Mediator_Pattern;
// 4. 新建一个中介者实体类
public class AchiveMediator extends AbstractMediator {
    public AchiveMediator(User userA, User userB) {
        super(userA, userB);
    }

    public void WinMoney(int cmoney, User user) {
        if(user == userA){
            userA.money += cmoney;
            userB.money -= cmoney;
            System.out.println("A赢"+cmoney+",当前A的余额为"+userA.money+",当前B的余额为"+userB.money);
        }else{
            userB.money += cmoney;
            userA.money -= cmoney;
            System.out.println("B赢"+cmoney+",当前A的余额为"+userA.money+",当前B的余额为"+userB.money);
        }
    }
}
package Practices.Mode.Mediator_Pattern;
// 5.测试
public class Test_Mian {
    public static void main(String[] args) {
        User userA = new CardUser(5000);
        User userB = new CardUser(5000);

        AbstractMediator mediator = new AchiveMediator(userA,userB);

        userA.changemoney(500,mediator);
        userB.changemoney(200,mediator);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值