zoukankan      html  css  js  c++  java
  • 设计模式18-中介者模式

    1. 概念

        用一个中介对象封装一些列的对象交互

    2. 案例

        实现下面的案例

        类A和B,类中各有一个数字,要保证类B中的数字永远是类A中数字的100倍。即:当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,

    就称为同事类 . 

        如果不使用中介者模式的代码如下: 

    abstract class AbstractColleague {  
        protected int number;  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number){  
            this.number = number;  
        }  
        //抽象方法,修改数字时同时修改关联对象  
        public abstract void setNumber(int number, AbstractColleague coll);  
    }  
      
    class ColleagueA extends AbstractColleague{  
        public void setNumber(int number, AbstractColleague coll) {  
            this.number = number;  
            coll.setNumber(number*100);  
        }  
    }  
      
    class ColleagueB extends AbstractColleague{  
          
        public void setNumber(int number, AbstractColleague coll) {  
            this.number = number;  
            coll.setNumber(number/100);  
        }  
    }  
      
    public class Client {  
        public static void main(String[] args){  
      
            AbstractColleague collA = new ColleagueA();  
            AbstractColleague collB = new ColleagueB();  
              
            System.out.println("==========设置A影响B==========");  
            collA.setNumber(1288, collB);  
            System.out.println("collA的number值:"+collA.getNumber());  
            System.out.println("collB的number值:"+collB.getNumber());  
      
            System.out.println("==========设置B影响A==========");  
            collB.setNumber(87635, collA);  
            System.out.println("collB的number值:"+collB.getNumber());  
            System.out.println("collA的number值:"+collA.getNumber());  
        }  
    }  

    下面看中介者模式的实现: 

     类A类B通过直接的关联发生关系,假如我们要使用中介者模式,类A类B之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的

    abstract class AbstractColleague {  
        protected int number;  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number){  
            this.number = number;  
        }  
        //注意这里的参数不再是同事类,而是一个中介者  
        public abstract void setNumber(int number, AbstractMediator am);  
    }  
      
    class ColleagueA extends AbstractColleague{  
      
        public void setNumber(int number, AbstractMediator am) {  
            this.number = number;  
            am.AaffectB();  
        }  
    }  
      
    class ColleagueB extends AbstractColleague{  
      
        @Override  
        public void setNumber(int number, AbstractMediator am) {  
            this.number = number;  
            am.BaffectA();  
        }  
    }  
      
    abstract class AbstractMediator {  
        protected AbstractColleague A;  
        protected AbstractColleague B;  
          
        public AbstractMediator(AbstractColleague a, AbstractColleague b) {  
            A = a;  
            B = b;  
        }  
      
        public abstract void AaffectB();  
          
        public abstract void BaffectA();  
      
    }  
    class Mediator extends AbstractMediator {  
      
        public Mediator(AbstractColleague a, AbstractColleague b) {  
            super(a, b);  
        }  
      
        //处理A对B的影响  
        public void AaffectB() {  
            int number = A.getNumber();  
            B.setNumber(number*100);  
        }  
      
        //处理B对A的影响  
        public void BaffectA() {  
            int number = B.getNumber();  
            A.setNumber(number/100);  
        }  
    }  
      
    public class Client {  
        public static void main(String[] args){  
            AbstractColleague collA = new ColleagueA();  
            AbstractColleague collB = new ColleagueB();  
              
            AbstractMediator am = new Mediator(collA, collB);  
              
            System.out.println("==========通过设置A影响B==========");  
            collA.setNumber(1000, am);  
            System.out.println("collA的number值为:"+collA.getNumber());  
            System.out.println("collB的number值为A的10倍:"+collB.getNumber());  
      
            System.out.println("==========通过设置B影响A==========");  
            collB.setNumber(1000, am);  
            System.out.println("collB的number值为:"+collB.getNumber());  
            System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());  
              
        }  
    }  
  • 相关阅读:
    业余草 SpringCloud教程 | 第十一篇: 断路器监控(Hystrix Dashboard)(Finchley版本)
    业余草 SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
    业余草 SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
    业余草 SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
    业余草 SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
    POJ2135 Farm Tour
    POJ1149 PIGS
    POJ3041 Asteroids
    2020.7.4模拟 数据结构 (ds)
    2020.7.4模拟 浇花 (flower)
  • 原文地址:https://www.cnblogs.com/liaokailin/p/3803614.html
Copyright © 2011-2022 走看看