美文网首页
中介者模式

中介者模式

作者: 竖起大拇指 | 来源:发表于2020-11-27 13:44 被阅读0次

    前言

    今天我们一起看看中介者模式,怎么去理解这个模式呢?说起来也简单、好理解。生活中我们租房经常都是通过中介来实现的。一般租房要么是房东直租要么是中介。那么今天要讲的中介者模式和租房的这个中介是否有关系呢?当然是有点关系的。中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,这个类就来处理不同类之间的通讯。租房中介也是这个道理。防止与各个房东和租户之间的通讯。将多对多简化成了一对多的关系。

    什么是中介者模式

    用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    代码示例

    关于租房中介的例子。假如没有租房中介。这里有六个房东需要出租房屋,房屋各不相同、各有各的特点、适合不一样的人租住。这六个房东之间刚好有点联系。然后都在出租房屋。这时租客A来租房,看了一号房东的房子不满意、但是一号房东觉得可以让他去看看其他五个朋友的房间。然后开始联系他的五个朋友。这样运行下去好像有是没有什么问题的。但是其中二号房东如果房屋不出租或者出租出去了。也就是发生了变化。这是他则需要通知其他五个朋友,告诉他们不用再给他介绍租客了。这里就造成了中间一个人发生了变化,需要改动其他五个人。那么如何可以解决这种情况呢。我们回到现在。把中介加进来、那六个房东都把房屋交给中介处理。租客A看房间一不满意直接通过中介看房间二。当房间二被出租了。中介也只需要通知房东二号、然后他们签订合同。下次还有人看房间就不会再看房间二了。这里一个出现了变化也就影响改变了一个。并不会影响其他另外五个房东。这个例子可以更好的帮助我们理解中介者模式。我们下面看两幅图。

    图一:不采用中介的房东租房模式,多对多网格,一动牵扯全身
    image.png
    图二:采用中介的租房模式,一对多,一个变动不影响其他
    image.png

    下面我们看看代码如何实现:

    // 抽象中介者
     public abstract class Mediator{
            
            // 定义与同事间的交互通信 
           public abstract void Common(string type);
    
        }
    
    
    
    
    /// 抽象同事类
       public abstract class Colleague{
            
            // 处理自己的事务(房东展示自己的房屋)
           public abstract void Handle();
    
        }
    

    具体的房屋中介:

    
        // 房屋中介
     public class HouseMediator  extends Mediator{
            
            // 中介有所有房东的房屋信息
            private SmallHouseColleague SmallHouse;
            private TwoHouseColleague TwoHouse;
            private ThreeHouseColleague ThreeHouse;
    
            public void SetSmallHouse(SmallHouseColleague small) {
                SmallHouse = small;
            }
    
            public void SetTwoHouse(TwoHouseColleague two){
                TwoHouse = two;
            }
    
            public void SetThreeHouse(ThreeHouseColleague three){
                ThreeHouse = three;
            }
            
            @override 
            public void Common(string  type){ 
                switch (type){
                    case "单间":
                        SmallHouse.Handle();
                        System.out.println("如果可以就可以租房了!");
                        break;
                    case "两居室":
                        TwoHouse.Handle();
                        System.out.println("如果可以就可以租房了!");
                        break;
                    case "三居室":
                        ThreeHouse.Handle();
                        System.out.println("如果可以就可以租房了!");
                        break;
                    default: 
                        System.out.println("type"+"暂时没有房源!");
                        break;
                }
            }
        }
    
    
    

    具体房东:

     /// 房东(小房间)
        public class SmallHouseColleague extends Colleague {
            /// 展示单间
            public override void Handle() {
                System.out.println( "单间——便宜整洁");
            }
        }
    
    
     
        /// 房东(两居室)
         public class TwoHouseColleague extends Colleague { 
              /// 展示两居室
            public override void Handle(){
                System.out.println("两居室——合适,靠谱");
            }
        }
    
    
    
        /// 房东(三居室)
     public class ThreeHouseColleague extends Colleague { 
            /// 展示三居室
         public override void Handle(){
                System.out.println("三居室——大气,宽松");
            }
        }
    
    
        public static void main(String[] args){
                System.out.println("一个租客看房:");
                ///初始化中介
                HouseMediator mediator = new HouseMediator();
    
                ///初始化房屋信息
                SmallHouseColleague smallHouseColleague = new SmallHouseColleague( );
                TwoHouseColleague twoHouseColleague = new TwoHouseColleague( );
                ThreeHouseColleague threeHouseColleague = new ThreeHouseColleague( );
    
                ///中介获取房屋信息
                mediator.SetSmallHouse(smallHouseColleague);
                mediator.SetTwoHouse(twoHouseColleague);
                mediator.SetThreeHouse(threeHouseColleague); 
    
                ///租户A需要两居室、提供看房
                mediator.Common("两居室");
    
                //租户B需要四居室、暂无房源
                mediator.Common("四居室");
    }
    
    

    使用场景

    1、系统中对象间存在较为复杂引用,导致依赖关系和结构混乱而无法复用的情况。
    2、想通过一个中间类来封装多个类的行为,但是又不想要太多的子类。

    优点

    1、松散耦合、将多个对象之间的联系紧耦合封装到中介对象中,做到松耦合。不会导致一动牵全身。

    2、将多个对象之间的交互联系集中在中介对象中。发送变化仅需修改中介对象即可、提供系统的灵活性、使同事对象独立而易于复用。

    3、符合迪米特原则。就是说一个对象应当对其他对象有尽可能少的了解。减少各个对象之间的了解。

    缺点

    1、如果各个同事间的交互非常多并且复杂情况下,都交给中介者会导致中介者变得十分复杂,不易维护和管理。

    总结

    到这里中介者模式就介绍完了。中介者模式主要是实现将多个对象的相互依赖和关联解耦。用中介对象封装一些列的对象交互。将多对多的相互转换为多对一的相互作用。我们再回忆我们之前所讲到的外观模式代理模式。好像三者之间有一些相似之处。那么我们如何区分这三种模式呢?首先我们看
    外观模式—注重的是简化接口,简化组件系统与外部程序的依赖关系。提供一个更高层次的统一接口,使子系统更加简便的使用
    代理模式—注重的是对其他对象的访问控制、倾向于的是一对一的关系处理
    中介者模式—注重的是将多对多的关系处理封装到一对多、通过一个中介者对象对多个对象之间的依赖进行解耦

    相关文章

      网友评论

          本文标题:中介者模式

          本文链接:https://www.haomeiwen.com/subject/vkcxwktx.html